Tkinter配置Frame高度后界面不实时更新问题求助
Tkinter Frame高度修改后无法即时更新问题
问题详情
我搭建了如下Tkinter界面:
- 创建占据整个窗口的
self.MainFrame - 在
self.MainFrame内通过grid管理器创建初始高度为500、仅左右黏连(sticky="EW")的self.testFrame,并关闭其grid_propagate - 在
self.testFrame内设置按钮,点击后需将self.testFrame高度改为100,但点击按钮后高度无变化,仅调整窗口大小时高度才会更新。调用self.root.update()也无法解决问题。
原代码如下:
from tkinter import Tk, Button, Frame class Mygui(): def __init__(self) -> None: self.root = Tk() self.root.geometry("800x800") self.root.columnconfigure(0, weight=1) self.root.rowconfigure(0, weight=1) self.MainFrame = Frame(self.root, bg= "red") self.MainFrame.grid(row=0, column=0, sticky="NSEW") self.MainFrame.columnconfigure(0, weight=1) self.testFrame = Frame(self.MainFrame, bg= "yellow", height=500) self.testFrame.grid(row=0, column=0, sticky="EW") self.testFrame.grid_propagate(False) self.button = Button(self.testFrame, command=self.test, text="Test me!") self.button.grid(row=1, column=0) def test(self): self.testFrame.configure(height=100) print("a") A = Mygui().root.mainloop()
补充尝试的代码(仍无效):
def test(self): self.testFrame.configure(height=100) self.root.update() print("a")
问题分析与解决方案
问题原因
testFrame在MainFrame的grid布局中仅设置了水平方向的黏连(EW),未配置垂直方向的布局约束,且MainFrame未对testFrame所在的行设置权重或最小高度。修改testFrame高度后,grid管理器不会自动触发垂直方向的布局更新,只有窗口尺寸变化时才会重新计算布局。
解决方案
提供两种有效解决方式:
方式一:修改test方法,强制更新布局
在修改testFrame高度后,显式配置MainFrame对应行的最小高度,并调用update_idletasks()触发布局重绘:
def test(self): self.testFrame.configure(height=100) # 设置MainFrame第0行的最小高度为100 self.MainFrame.rowconfigure(0, minsize=100) # 触发空闲任务更新,强制刷新布局 self.root.update_idletasks() print("a")
方式二:初始化时完善布局约束
在初始化testFrame时,添加垂直方向的黏连,并给MainFrame的第0行配置权重,让布局自动响应高度变化:
# 初始化testFrame时修改grid参数 self.testFrame.grid(row=0, column=0, sticky="NSEW") # 给MainFrame的第0行设置权重,使其占据可用垂直空间 self.MainFrame.rowconfigure(0, weight=1)
此时test方法只需修改高度并触发更新即可:
def test(self): self.testFrame.configure(height=100) self.root.update_idletasks() print("a")
内容的提问来源于stack exchange,提问作者David pociello quadrado
相关产品推荐
相关产品推荐

