You need to enable JavaScript to run this app. 如何在Tkinter的notebook组件中新建标签页且不覆盖原有标签页
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tkinter的notebook组件中新建标签页且不覆盖原有标签页

问题修复方案

根因说明

Tkinter 中每个UI组件实例只能归属一个父容器,同一时间仅能在一个位置渲染。你当前代码中直接复用已绑定到Tab1的Frame1实例添加为新标签页,本质是将该Frame从原有Tab1移动到新的Tab3,因此会出现原有Tab1内容被清空的问题。你需要的是生成结构完全一致的全新Frame实例,而非复用旧实例。

修复后完整代码

# Imports
from tkinter import *
from tkinter import ttk

# Screen
root = Tk()
root.geometry("600x600")
root.title("Example")

# 封装生成Tab内容Frame的可复用函数,每次调用返回全新实例
def create_tab_content(parent):
    frame = Frame(parent, width=500, height=500, bg="Orange")
    # 给新生成的Frame也添加对应的新增按钮
    ExampleButton = Button(frame, text="Click Here to Add New Tab to notebook", command=CreateANewTabFunc)
    ExampleButton.pack()
    return frame

# Create New Tab Function
def CreateANewTabFunc():
    # 每次新增Tab都生成全新的Frame实例
    new_tab_frame = create_tab_content(TabControl)
    TabControl.add(new_tab_frame, text=f"Tab {len(TabControl.tabs()) + 1}") # 自动生成Tab序号

# Tab Control - Used for Placing the Tabs
TabControl = ttk.Notebook(root)
TabControl.pack()

# Frame 1 = Main Frame 调用封装函数生成
Frame1 = create_tab_content(TabControl)
Frame1.pack()

# Frame 2 = Settings or Something Else
Frame2 = Frame(TabControl, width=500, height=500, bg="Green")
Frame2.pack()

TabControl.add(Frame1, text="Tab 1")
TabControl.add(Frame2, text="Tab 2")

# Mainloop
root.mainloop()

关键改动点

  • 封装了create_tab_content公共函数,每次调用都会生成结构完全相同的全新Frame实例,避免复用同一实例
  • 新增Tab时调用该函数生成新Frame,再添加到Notebook中
  • 自动计算标签序号,后续多次点击按钮也可以持续生成新的Tab,序号不会重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 08:15:04