[英]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.