[英]Tkinter GUI: Replacing one button in a row with a label WITHOUT changing the size of the row. Even by a millimetre
我做了一個游戲,你有一個 10*10 的按鈕網格。 其中十個被隨機選擇為“坦克”。 如果您單擊坦克,則該按鈕將替換為 label “命中。”,我遇到的問題是,一旦發生這種情況。 該按鈕的行比其他行長一點還是短一點? 我該如何阻止這個?
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()
我通過用 grid() 替換 pack() 解決了這個問題,因此刪除了所有框架,而是將 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
現在我可以精確定位按鈕並更改它,而不必以特定順序重寫整行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.