You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:24:13