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

Python Tkinter类方法中创建Notebook组件不显示的问题

问题解决:Tkinter类方法中创建ttk.Notebook不显示的问题

问题原因

你把Notebook放在了Stakeholders这个Frame实例上,但这个Frame本身没有被添加到主窗口的布局管理器里(未调用pack()/grid()/place()),导致整个Frame不可见,里面的Notebook自然也无法显示。

第一种代码能正常显示,是因为直接把Notebook挂在了self.master(主窗口root)上,绕开了Frame的布局问题。

修正后的代码

只要给Stakeholders这个Frame实例添加布局即可,有两种实现方式:

方式一:在创建实例时添加布局

import tkinter as tk
from tkinter import ttk

class Stakeholders(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.make_notebook()
        
    def make_notebook(self):
        self.notebook = ttk.Notebook(self)
        self.notebook.pack(pady=10, expand=True)
        
        frame1 = ttk.Frame(self.notebook, width=300, height=300)
        frame2 = ttk.Frame(self.notebook, width=300, height=300)
        
        frame1.pack(fill='both', expand=True)
        frame2.pack(fill='both', expand=True)

        self.notebook.add(frame1, text='Owner')
        self.notebook.add(frame2, text='Architect')

def create_window():
    root = tk.Tk()
    root.geometry('400x300')
    root.title('Stakeholders')
    
    app = Stakeholders(root)
    app.pack(fill='both', expand=True)  # 关键:给Frame添加布局
    root.mainloop()
    
if __name__ == "__main__":
    create_window()

方式二:在类的__init__中给自己添加布局

import tkinter as tk
from tkinter import ttk

class Stakeholders(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill='both', expand=True)  # 初始化时直接布局自身
        self.make_notebook()
        
    def make_notebook(self):
        self.notebook = ttk.Notebook(self)
        self.notebook.pack(pady=10, expand=True)
        
        frame1 = ttk.Frame(self.notebook, width=300, height=300)
        frame2 = ttk.Frame(self.notebook, width=300, height=300)
        
        frame1.pack(fill='both', expand=True)
        frame2.pack(fill='both', expand=True)

        self.notebook.add(frame1, text='Owner')
        self.notebook.add(frame2, text='Architect')

def create_window():
    root = tk.Tk()
    root.geometry('400x300')
    root.title('Stakeholders')
    
    Stakeholders(root)
    root.mainloop()
    
if __name__ == "__main__":
    create_window()

补充说明

Tkinter中所有组件都必须通过布局管理器(pack/grid/place)挂载到父容器上,才能被渲染显示。当你把Notebook作为Frame的子组件时,Frame本身也需要被布局到它的父容器(此处为主窗口root)中,否则整个Frame及其子组件都会处于不可见状态。

内容的提问来源于stack exchange,提问作者David Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:31