Python Tkinter GUI:用标签替换行中的一个按钮,而不更改行的大小。甚至一毫米
我做了一个游戏,你有一个10*10的按钮网格。其中10个被随机选择为“坦克”。如果你点击坦克,按钮将被替换为标签“击中!”。我的问题是,一旦发生这种情况,该按钮的行要么比其他行长一点,要么短一点。我该怎么阻止这一切Python Tkinter GUI:用标签替换行中的一个按钮,而不更改行的大小。甚至一毫米,python,python-3.x,button,tkinter,label,Python,Python 3.x,Button,Tkinter,Label,我做了一个游戏,你有一个10*10的按钮网格。其中10个被随机选择为“坦克”。如果你点击坦克,按钮将被替换为标签“击中!”。我的问题是,一旦发生这种情况,该按钮的行要么比其他行长一点,要么短一点。我该怎么阻止这一切 button[hit] = Label(text="Hit!", padx=5.5) 如果我将“padx”设置为5.4,那么它只比其他行短一点,而不是长一点 我试过用几个小数点来表示中间的数字,但就是不起作用 from tkinter import * import rand
button[hit] = Label(text="Hit!", padx=5.5)
如果我将“padx”设置为5.4,那么它只比其他行短一点,而不是长一点
我试过用几个小数点来表示中间的数字,但就是不起作用
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()
我将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
现在,我可以精确地定位一个按钮并对其进行更改,而不必按特定顺序重写整行。无需更改大小:在
画布上布局
或使用框架
。对于带有propagate(0)
的每个小部件,为什么不使用网格布局呢?您只需在小部件上使用网格,并使用grod_proagate(0)
来防止小部件的大小调整。我使用了网格布局,现在就可以了。这也让我的生活更简单,因为我现在可以瞄准并替换一个按钮,而不是试图删除和重写整行。谢谢大家。@Mike SMT:如果他们使用网格,他们不会(通常也不应该)关闭传播。有一些选项可以强制所有行和列具有统一的大小。