[英]Unable to change Tkinter frame color
我正在嘗試使用 Tkinter 創建一些簡單的東西。 在其中,我正在創建一系列框架,然后使用frame.grid()
將它們放在另一個框架內。 我能夠檢索框架並打印出有關它的信息,但我無法更改顏色。
我瀏覽了其他帖子,但無法找到解決方案。 我努力了:
.config(bg=color)
/ .configure(bg=color)
更新顏色frame['bg']=
更新顏色 當我通過<Button-1>
事件調用 function 時,我能夠編輯框架的顏色,但是當我運行不同的 function 時,它無法更改 Z62848E3CE52204AA985Z.13A7B7
我正在使用Replit,這是重要的代碼:
window = tk.Tk()
window.wm_attributes('-fullscreen',True)
window.config(bg='#111111')
height = window.winfo_screenheight()
width = window.winfo_screenwidth()
#window.geometry(f'{height}x{height}')
rows = height//gridSize
columns = height//gridSize
frame = tk.Frame(master=window, bg='#111111', width=height, height=height, pady=10)
frame.pack(side=tk.BOTTOM)
def getNumLiveNeighbors(cellRow, cellColumn):
numLiveNeighbors = 0
# print(cellRow, cellColumn)
r = -2
for i in range(3):
c = -2
r += 1
for a in range(3):
c += 1
if(r==0)and(c==0):
continue
nRow, nCol = cellRow+r, cellColumn+c
if(((nRow<0)or(nRow>=gridSize))or(nCol<0)or(nCol>=gridSize)):
continue
neighbor = frame.grid_slaves(row=nRow, column = nCol)[0]
if(neighbor['bg']=='#ffffff'):
numLiveNeighbors += 1
#neighbor.config(bg='#252525')
return numLiveNeighbors
def toggleColor(event):
widget = event.widget
if(widget['bg']=='#ffffff'):
widget.config(bg='#222222')
else:
widget.config(bg='#ffffff')
info = widget.grid_info()
print(getNumLiveNeighbors(info['row'], info['column']))
print(event.x, event.y)
return
for i in range(gridSize):
window.columnconfigure(i, weight = 1)
window.rowconfigure(i, weight = 1)
for i in range(gridSize):
cellGrid[i] = {}
for j in range (gridSize):
box = tk.Frame(master=frame, bg='#222222', relief=tk.RAISED, width=columns, height=columns)
cellGrid[i][j] = box
box.bind('<Button-1>', toggleColor)
box.grid(row=i,column=j,sticky='nsew')
def runGame(event):
frameCount = 0
print('Running game!')
while(True):
print(f'Frame #{frameCount}')
frameCount += 1
for row in range(gridSize):
for col in range(gridSize):
time.sleep(0.5)
cell = frame.grid_slaves(row=row, column=col)[0]
numNeighbors = getNumLiveNeighbors(row, col)
print(numNeighbors)
if(numNeighbors<2):
print('Less than 2, do nothing')
#cell.config(bg='#222222')
elif(numNeighbors==3):
print('3 Neighbors, make cell alive!')
cell['bg']='#ffffff'
elif(numNeighbors>3):
print('Greater than 3 neighbors, kill the cell')
cell['bg']='#222222'
print(cell['bg'])
window.bind('<Return>', runGame)
如果閱讀內容太多,我可以進一步分解並解釋我對每個函數/行所做的事情。
其主要目標是創建像康威的生命游戲一樣的元胞自動機,但我一直在嘗試更新“細胞”的顏色。
你不能使用這樣的無限循環。 與所有 GUI 框架一樣,Tk 是事件驅動的。 當您創建 window 或進行更改時,實際上不會進行任何繪圖。 它只是發送一條消息。 當您返回主循環時,該消息將被發送並執行。 在您的情況下,您永遠不會退出循環,因此您的處理程序永遠不會返回,主循環永遠不會運行,並且您的 UI 會凍結。
您需要使用window.after
來請求計時器回調,而不是使用 time.sleep time.sleep(0.5)
的無限循環。 做一代並返回(在再次調用window.after
之后)。 這樣,主循環就處於控制之中,一切都會好起來的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.