为何Tkinter Frame未包裹两个Label?如何指定控件归属Frame
问题分析与解决方案
你踩了Tkinter里一个很常见的新手小坑哦!问题的根源出在Frame创建和布局的链式调用上:
当你写notebook_Frame = tk.Frame(mainWinTk, ...).grid(...)的时候,grid()方法的返回值是None——这是Tkinter所有布局方法(grid/pack/place)的共性。所以notebook_Frame实际上并没有指向你创建的Frame组件,而是变成了None。
后面的两个Label把notebook_Frame(也就是None)作为父组件时,Tkinter会默认将它们挂载到主窗口mainWinTk上,这就导致Label2跑到了绿色边框的Frame外面,只有Label1因为位置巧合看起来像是在Frame里,但实际上它也是主窗口的子组件。
修正后的代码
import tkinter as tk def main(): mainWinTk = tk.Tk() mainWinTk.title("Setup Server") mainWinTk.columnconfigure(0, weight=1) mainWinTk.rowconfigure(0, weight=1) mainWinTk.rowconfigure(1, weight=1) # 拆分Frame的创建与布局:先创建对象,再单独调用grid notebook_Frame = tk.Frame(mainWinTk, highlightbackground="green", highlightthickness=3, borderwidth=2, relief='ridge') notebook_Frame.grid(column=0, row=0, sticky=tk.W+tk.E+tk.S+tk.N) # 两个Label的父组件是真正的notebook_Frame,会被正确包含 tk.Label(notebook_Frame, text="Label 1", highlightbackground="red", highlightthickness=3).grid(column=0, row=0) tk.Label(notebook_Frame, text="Label 2", highlightbackground="red", highlightthickness=3).grid(column=0, row=1) mainWinTk.mainloop() if __name__ == "__main__": main()
关键改动说明
- 把Frame的创建和
grid()布局拆成两行:这样notebook_Frame会正确指向你创建的Frame组件,而不是None。 - 两个Label现在以
notebook_Frame为父组件,会被Frame正确包裹,绿色边框也会覆盖两个Label的区域。
以后写Tkinter代码的时候要注意:永远不要把布局方法的返回值赋值给组件变量,一定要先创建组件对象,再单独调用布局方法。
内容的提问来源于stack exchange,提问作者NDEthos
相关产品推荐
相关产品推荐

