簡體   English   中英

無法更改 Tkinter 框架顏色

[英]Unable to change Tkinter frame color

我正在嘗試使用 Tkinter 創建一些簡單的東西。 在其中,我正在創建一系列框架,然后使用frame.grid()將它們放在另一個框架內。 我能夠檢索框架並打印出有關它的信息,但我無法更改顏色。

我瀏覽了其他帖子,但無法找到解決方案。 我努力了:

  • 使用.config(bg=color) / .configure(bg=color)更新顏色
  • 使用frame['bg']=更新顏色
  • 在創建框架之前或之后放置 function。

當我通過<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM