如何在tkinter中混合使用pack和grid布局并解决冲突报错
问题根源
Tkinter对同一个父容器下的子组件,只允许使用同一种布局管理器,你代码中:
- 根窗口
root的子组件f1使用了grid()布局 - 后续触发
raise_bilance()时,同为root子组件的labelframe使用了pack()布局
两种布局冲突直接触发报错。此外你的代码中还调用了未定义的raise_frame()函数,运行时也会抛出异常。
解决方法
统一根窗口的布局管理器即可,这里提供两种可行修改方案:
方案1:根窗口统一使用pack布局
把f1的布局从grid改为pack,同时删除未定义的raise_frame()调用,修改后的完整代码如下:
import tkinter as tk root = tk.Tk() def raise_bilance(): labelframe = tk.LabelFrame(root, text="Bilance today") labelframe.pack(fill="both", expand="yes") left = tk.Label(labelframe, text="Profit $1.000.000") left.pack() f1 = tk.Frame(root) # 把grid改为pack,和后续labelframe的布局保持一致 f1.pack(fill="both", expand="yes") tk.Button( f1, text="Click on me", command=lambda: raise_bilance() ).pack() tk.Label(f1, text="Click").pack() # 删除未定义的raise_frame调用 root.mainloop()
方案2:根窗口统一使用grid布局
把labelframe的布局从pack改为grid即可,代码修改如下:
import tkinter as tk root = tk.Tk() # 配置root的grid权重,让组件可以自适应拉伸 root.grid_rowconfigure(0, weight=1) root.grid_rowconfigure(1, weight=1) root.grid_columnconfigure(0, weight=1) def raise_bilance(): labelframe = tk.LabelFrame(root, text="Bilance today") # 把pack改为grid,和f1的布局保持一致 labelframe.grid(row=1, column=0, sticky="nsew") left = tk.Label(labelframe, text="Profit $1.000.000") left.pack() f1 = tk.Frame(root) f1.grid(row=0, column=0, sticky="news") tk.Button( f1, text="Click on me", command=lambda: raise_bilance() ).pack() tk.Label(f1, text="Click").pack() # 删除未定义的raise_frame调用 root.mainloop()
注意:不同父容器的布局管理器不会冲突,比如
f1内部用pack、labelframe内部用pack都是合法的,只要保证同一个父容器下的子组件布局统一即可。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

