Tkinter GUI:用标签替换一行中的一个按钮,而无需更改行的大小。甚至一毫米

问题描述 投票:1回答:1

我制作了一个游戏,其中有10 * 10的按钮网格。其中十个被随机选择为“坦克”。如果单击水箱,则该按钮将替换为标签“ Hit!”。我的问题是,一旦发生这种情况,该按钮的行会比其他行长或短。如何停止?

button[hit] = Label(text="Hit!", padx=5.5)

enter image description hereenter image description here

如果我将“ padx”设置为5.4,则它仅比其他行短一点,而不是更长。

enter image description here

我尝试使用介于两个小数点之间的数字,但这是行不通的。

from tkinter import *
import random

root = Tk()
button = [""] * 100
row = [""] * 10
tank = [""] * 10
showHit = Label(text="Hit!")
prevHits = []

for i in range(10):
    x = 3
    y = random.randint(0,9)
    tank[i] = "(" + str(x) + "," + str(y) + ")"
print(*tank)

def getPos(pos):
    global tank
    print(pos)
    for i in tank:
        if pos == i:
            print("Hit!")
            a = int(pos[1])
            b = int(pos[3])
            print(a, b)  
            hit = a*10# + b
            for i in range(10):
                button[hit].destroy()
                hit += 1
            hit = a*10
            for i in range(10):
                if hit != (a*10) + b and not hit in prevHits:
                    string = "(" + str(a) + "," + str(i) + ")"
                    button[hit] = Button(root, text=string, command=lambda pos=string: getPos(pos))
                    button[hit].pack(in_=row[a], side=LEFT)
                else:
                    button[hit] = Label(text="Hit!", padx=5.4)
                    button[hit].pack(in_=row[a], side=LEFT)
                    prevHits.append(hit)
                print(hit)
                hit += 1



for r in range(len(row)):
    row[r] = Frame(root)
    row[r].pack()
    print(row[r])


num = len(button)
for i in range(num):
    t = i
    t %= 10
    if t == 0:
        r +=1
    if r == 10:
        r = 0
    string = "(" + str(r) + "," + str(t) + ")"
    button[i] = Button(root, text=string, command=lambda pos=string: getPos(pos))
    r = i // 10
    button[i].pack(in_=row[r], side=LEFT)

mainloop()
python python-3.x button tkinter label
1个回答
0
投票

我解决了问题,方法是将pack()替换为grid(),因此删除了所有框架,而是在每行中放置了10个按钮。我也设法改善了代码:

        for i in range(10):
                if not hit != (a*10) + b and not hit in prevHits:
                    button[hit] = Label(text="Hit!", padx=5.4)
                    button[hit].grid(row=a, column=b, sticky = W)
                    prevHits.append(hit)
                print(hit)
                hit += 1

现在,我可以精确地定位按钮并进行更改,而不必以特定顺序重写整个行。

© www.soinside.com 2019 - 2024. All rights reserved.