ttk.Notebook 是 Tkinter 中用于创建多标签页界面的组件,就像一个带标签的文件夹,让复杂的功能分区显示,界面更清晰。它的核心用法是先将一个容器(通常是 ttk.Frame)添加到 Notebook 上,再把这个 Frame 当作独立的页面来填充内容。
2、模块导入
import tkinter as tkfrom tkinter import ttk
3、主窗口的创建
import tkinter as tkfrom tkinter import ttkroot=tk.Tk() #创建主窗口实例对象rootroot.title("Notebook组件")root.geometry("400x300+600+200")root.mainloop()
4、Notebook组件常用属性
| |
| 设置标签页区域的高度(像素) |
| 设置标签页区域的宽度(像素) |
| 内边距,格式为 (left, top, right, bottom) 或单个数值 |
| 指定样式名称(配合 ttk.Style 使用) |
| 是否可以通过 Tab 键获得焦点 |
import tkinter as tkfrom tkinter import ttkroot=tk.Tk() #创建主窗口实例对象rootroot.title("Notebook组件")root.geometry("400x300+600+200")nb=ttk.Notebook(root,height=200,width=100) #创建组件对象nbnb.pack(expand="True",fill="both",padx=10,pady=10)root.mainloop()
5、Notebook组件常用方法
| |
| 添加一个新的标签页。child 通常是一个 ttk.Frame。 |
insert(pos, child, **kwargs) | 在指定位置(索引)插入标签页。 |
forget(tab_id) | 永久删除指定标签页。 |
hide(tab_id) | 临时隐藏标签页(可用 add() 恢复)。 |
select(tab_id=None) | 切换到指定标签页(按索引或组件);无参时返回当前选中的标签页标识。 |
tab(tab_id,option=None, **kwargs) | 查询或修改标签页的选项(如 text、state、image)。 |
index(tab_id) | 获取标签页的索引位置。 |
tabs() | 返回所有标签页标识的列表。 |
enable_traversal() | 启用键盘快捷键(Alt + 标题带下划线的字母)。 |
import tkinter as tkfrom tkinter import ttkroot=tk.Tk() #创建主窗口实例对象rootroot.title("Notebook组件")root.geometry("400x300+600+200")nb=ttk.Notebook(root,height=200,width=100) #创建Notebook组件对象nbnb.pack(expand="True",fill="both",padx=10,pady=10)#创建标签页的内容容器 (Frame)tab1=ttk.Frame(nb)nb.add(tab1,text="欢迎") #将Frame对象tab1添加为标签页,标题为"欢迎"tab2=ttk.Frame(nb)nb.add(tab2,text="设置") #将Frame对象tab2添加为标签页,标题为"设置"#在标签页tab1中添加组件内容btn1=ttk.Button(tab1,text="确定")btn1.pack(pady=5)btn2=ttk.Button(tab1,text="取消")btn2.pack(pady=5)#在标签页tab2中添加组件内容label=ttk.Label(tab2,text="这是一个输入框:")label.pack(pady=5)entry=ttk.Entry(tab2,width=10)entry.pack(pady=5)root.mainloop()
6、示例代码:创建一个带有四个标签页的窗口
(1)添加、插入标签页
(2)动态修改标题和禁用标签页
(3)删除、隐藏标签页
(4)获取当前标签页并绑定切换事件
import tkinter as tkfrom tkinter import ttkroot=tk.Tk() #创建主窗口实例对象rootroot.title("Notebook组件")root.geometry("400x300+600+200")#创建Notebook组件对象nb=ttk.Notebook(root,padding=5)nb.pack(expand=True,fill="both",padx=10,pady=10)#添加第一个标签页tab1=ttk.Frame(nb)nb.add(tab1,text="首页")ttk.Label(tab1,text="Notebook演示").pack(pady=20)ttk.Button(tab1,text="切换到第二个标签页",command=lambda: nb.select(1)).pack()#添加第二个标签页def insert_tab(): new_tab=ttk.Frame(nb) ttk.Label(new_tab,text="我是插入的标签页",background="red").pack(expand=True,fill="both") nb.insert(1,new_tab,text="插入页") nb.select(new_tab)tab2=ttk.Frame(nb)nb.add(tab2,text="设置")ttk.Label(tab2,text="这里是设置页面").pack(pady=20)ttk.Button(tab2,text="在位置1插入新标签页",command=insert_tab).pack(pady=5)#添加第三个标签页tab3=ttk.Frame(nb)nb.add(tab3,text="已禁用")nb.tab(tab3,state="disabled") # 禁用此标签页ttk.Label(tab3,text="这个标签页被禁用了,无法点击").pack(pady=20)#添加第四个标签页def change_title(): current_title=nb.tab(tab4,"text") new_title="标题已改" if current_title == "动态标题" else "动态标题" nb.tab(tab4,text=new_title)tab4=ttk.Frame(nb)nb.add(tab4,text="动态标题")ttk.Label(tab4,text="点击下方按钮修改我的标题").pack(pady=20)ttk.Button(tab4,text="修改标题",command=change_title).pack()#控制面板(位于Notebook下方)def get_current_index(): current=nb.select() idx=nb.index(current) text=nb.tab(current,"text") print(f"当前选中:索引{idx},标题\"{text}\"")def restore_hidden(): if tab2 in nb.tabs(): print("第二个标签页并未隐藏") else: nb.add(tab2,text="设置") #恢复后标题需重新指定 print("已恢复隐藏的标签页")control_frame = ttk.Frame(root)control_frame.pack(pady=10)ttk.Button(control_frame, text="获取当前标签页索引", command=get_current_index).pack(side="left", padx=5)ttk.Button(control_frame, text="隐藏第二个标签页", command=lambda: nb.hide(tab2)).pack(side="left", padx=5)ttk.Button(control_frame, text="恢复隐藏的标签页", command=restore_hidden).pack(side="left", padx=5)ttk.Button(control_frame, text="删除第三个标签页", command=lambda: nb.forget(tab3)).pack(side="left", padx=5)root.mainloop()