如何扩展ttk Notebook标签填充窗口并修改标签样式?
解决ttk Notebook标签填充窗口及自定义样式问题
刚好我之前折腾过ttk Notebook的这类自定义需求,咱们一步步来搞定你的两个问题:
一、让标签填充整个可用窗口宽度
ttk Notebook的标签不像普通Button那样直接靠grid的sticky和列配置就能拉伸,因为它的标签尺寸是由样式系统控制的。不过我们可以通过自定义Notebook样式,设置标签的expand属性来让所有标签均匀填充整个窗口宽度:
- 先创建一个ttk样式对象,定义自定义Notebook样式
- 给该样式的Tab设置
expand=1,让每个标签自动拉伸平分可用空间 - 把Notebook组件应用这个自定义样式
二、修改标签的背景色及其他样式
ttk的样式系统可以控制标签的几乎所有视觉属性,包括选中/未选中状态的背景色、文字颜色、字体、内边距等。我们用configure设置默认样式,用map设置不同状态下的样式变化。
完整示例代码
import tkinter as tk from tkinter import ttk root = tk.Tk() root.geometry('600x400+0+0') root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) # 创建自定义样式对象 style = ttk.Style() # 配置自定义Notebook标签的基础样式:填充宽度+视觉属性 style.configure('Custom.TNotebook.Tab', expand=1, # 核心设置:让标签拉伸填充可用空间 background='#e0e0e0', # 未选中标签的背景色 foreground='#333333', # 未选中标签的文字颜色 padding=[15, 8], # 标签内边距(左右,上下) font=('Segoe UI', 10)) # 设置选中状态下的样式变化 style.map('Custom.TNotebook.Tab', background=[('selected', '#2196F3')], # 选中标签的背景色 foreground=[('selected', 'white')], # 选中标签的文字颜色 relief=[('selected', 'flat')]) # 选中标签的边框样式 # 应用自定义样式的Notebook组件 tabs = ttk.Notebook(root, style='Custom.TNotebook') tabs.grid(row=0, column=0, sticky='nsew') tab1 = tk.Frame(tabs, bg='red') tab2 = tk.Frame(tabs, bg='green') tabs.add(tab1, text='First Tab') tabs.add(tab2, text='Second Tab') root.mainloop()
额外说明
- 标签数量变化时,该方法依然有效,所有标签会自动平分整个窗口宽度
- 你可以根据需求调整
padding、font、颜色值,甚至添加relief(边框样式)等更多属性 - 部分tkinter主题(比如Windows的vista)对自定义样式支持有限,如果样式不生效,可以先尝试切换到
clam主题:style.theme_use('clam'),这个主题对自定义样式的兼容性更好
内容的提问来源于stack exchange,提问作者Manish Pushpam




