You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何扩展ttk Notebook标签填充窗口并修改标签样式?

解决ttk Notebook标签填充窗口及自定义样式问题

刚好我之前折腾过ttk Notebook的这类自定义需求,咱们一步步来搞定你的两个问题:

一、让标签填充整个可用窗口宽度

ttk Notebook的标签不像普通Button那样直接靠gridsticky和列配置就能拉伸,因为它的标签尺寸是由样式系统控制的。不过我们可以通过自定义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()

额外说明

  • 标签数量变化时,该方法依然有效,所有标签会自动平分整个窗口宽度
  • 你可以根据需求调整paddingfont、颜色值,甚至添加relief(边框样式)等更多属性
  • 部分tkinter主题(比如Windows的vista)对自定义样式支持有限,如果样式不生效,可以先尝试切换到clam主题:style.theme_use('clam'),这个主题对自定义样式的兼容性更好

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

火山引擎 最新活动