繁体   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