Tkinter Notebook控件未按预期工作 界面无选项卡显示
问题说明
开发包含2个Frame、1个控制器类的简易Tkinter GUI应用时,控制器类中实现的ttk.Notebook控件未正常生效,界面没有出现预期的选项卡组件。
问题复现代码:
import tkinter as tk from tkinter import ttk class WrapFrame(tk.Frame): def __init__(self, root): super().__init__(root) class UnwrapFrame(tk.Frame): def __init__(self, root): super().__init__(root) class Controller(tk.Frame): def __init__(self, root): super().__init__(root) # Notebook notebook = ttk.Notebook(self) wrap_frame = WrapFrame(notebook) unwrap_frame = UnwrapFrame(notebook) notebook.add(wrap_frame, text="Wrap") notebook.add(unwrap_frame, text="Unwrap") notebook.pack() class App(tk.Tk): def __init__(self): super().__init__() self.title('Mod') self.geometry('300x200') self.resizable(False, False) app = App() Controller(app) app.mainloop()
代码运行后实际效果:
故障原因
Tkinter有明确的渲染规则:除根窗口外,所有组件创建完成后,必须调用pack()/grid()/place()三种布局方法的其中一种,才会被添加到父容器的渲染队列中。
你的代码里虽然在Controller内部给Notebook做了pack()布局,但Controller本身是继承自tk.Frame的自定义组件,实例化后没有调用任何布局方法挂载到主窗口app上,最终导致Controller以及它内部的Notebook、两个子Frame全部不会在界面显示,只能看到空白的主窗口。
修复方案
在实例化Controller后,补充布局代码将其挂载到主窗口即可,修改主程序启动部分的代码:
app = App() # 补充pack布局,让Controller填充满整个主窗口 Controller(app).pack(fill=tk.BOTH, expand=True) app.mainloop()
修改后重新运行,就能正常看到顶部的Wrap、Unwrap两个选项卡。如果需要选项卡内部的Frame随窗口自适应填充,再给子Frame补充对应布局规则即可,不影响选项卡本身的显示。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

