Tkinter Frame未排列在同级组件下方反而嵌入其他组件问题求助
问题核心原因
所有异常的根源是组件实例化和布局方法调用写在同一行赋值:Tkinter中pack()/grid()/place()三个布局方法没有返回值,执行后返回None。你代码中frm_A = tk.Frame(master=window).pack()的写法,最终frm_A变量存储的是None而非Frame实例。后续你指定按钮、进度条的master=frm_A/master=frm_B,等于没有指定父组件,这些组件会默认挂载到根窗口window上,完全脱离了你预期的Frame分组,所以布局全部不符合预期。
异常现象对应解释
- 按钮修改
side参数后跑到标签和进度条两侧:两个按钮的父组件实际是根窗口,所以会在根窗口的区域内左右排列,就出现在了上层标签和下层进度条的中间两侧。 - 设置背景色的Frame和内部内容分离:你创建的带黑色背景的Frame确实成功渲染,但它和进度条、标签都是根窗口的同级子组件,自然会分开排列;同时Frame没有子组件、也没设置
pack_propagate(False)的话,默认会收缩到最小尺寸,你看到的空Frame就是这个没有承载任何子组件的独立实例。
修复方案
- 所有组件都要先实例化赋值给变量,再单独调用布局方法,保证变量存储的是有效组件实例
- 要让Frame强制使用你设置的固定尺寸,需要调用
pack_propagate(False),关闭Frame根据子组件自动调整尺寸的特性 - 两个按钮只需要在所属的Frame内设置
side=tk.LEFT即可实现并排
修正后完整代码:
import tkinter as tk from tkinter import ttk window = tk.Tk() # 顶部标签 lbl_1 = tk.Label(master = window, text='One Ring') lbl_1.pack() # 第一个Frame,承载按钮 frm_A = tk.Frame(master=window) frm_A.pack() # Frame内两个按钮并排 btn_2 = tk.Button(master=frm_A, text='rule them') btn_2.pack(side=tk.LEFT) btn_3 = tk.Button(master=frm_A, text='find them') btn_3.pack(side=tk.LEFT) # 第二个Frame,承载进度条,设置固定尺寸和背景色 frm_B = tk.Frame(master=window, bg='black', width=350, height=150) frm_B.pack_propagate(False) frm_B.pack(pady=10) pb_4 = ttk.Progressbar( master=frm_B, orient= 'horizontal', mode= 'determinate', length= 300 ) pb_4.pack(pady=20) lbl_5 = tk.Label(master=frm_B, text='forever binding 0%', bg='black', fg='white') lbl_5.pack() window.mainloop()
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

