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

如何为单个Tkinter Notebook标签设置不同前景文字颜色?

问题:如何给ttk.Notebook的单个标签设置不同的文字颜色?

我想把Notebook的某个标签前景文字颜色设成和其他标签不一样,创建了自定义样式Red.TNotebook.Tab并把前景色设为红色,想让标签B显示红色字体,但把这个样式应用到对应的Frame上后没生效,请问要修改哪个属性才能实现单个标签的样式设置?

我的代码如下:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry('%dx%d+0+0' %(200,200))
style = ttk.Style()
style.theme_use("default")

# Notebook Style
style.configure('TNotebook', background='white')
style.configure('TNotebook.Tab', background='white', foreground='black')
style.map('TNotebook.Tab',background=[("selected",'green')])
style.configure('Red.TNotebook.Tab', foreground = 'red')

# Create Notebook and Frames
Book = ttk.Notebook(root)

aFrame = ttk.Frame(Book)

# 我把红色标签样式应用到这个Frame,但标签颜色没变化
# 我不清楚Frame和Notebook的标签之间有什么关联
bFrame = ttk.Frame(Book, style='Red.TNotebook.Tab')

# Pack
aFrame.pack(fill = tk.BOTH, expand = True)
bFrame.pack(fill = tk.BOTH, expand = True)
Book.pack(fill = tk.BOTH, expand = True)

# Add Tabs
Book.add(aFrame, text = 'A')
Book.add(bFrame, text = 'B')

root.mainloop()

解答

问题根源

你错误地将标签样式应用到了Frame组件上,但ttk.Notebook的标签样式属于Notebook自身,和标签对应的Frame没有直接关联——Frame的样式仅影响其自身外观,不会作用到上方的标签。

实现方案

ttk.Notebook没有原生支持给单个标签绑定独立样式的API,但可以通过以下两种简单方式实现需求:

方案1:直接通过tab()方法修改单个标签属性(推荐)

使用Notebook.tab(标签对应的Frame, 属性=值)的方式,直接给指定标签设置前景色,无需自定义样式,操作最直接:

# 添加完标签后执行
Book.tab(bFrame, foreground='red')

方案2:自定义样式结合事件切换(适合复杂样式场景)

如果需要给单个标签设置更复杂的样式(比如背景色、字体等),可以先定义多个标签样式,再通过绑定<<NotebookTabChanged>>事件,在切换标签时动态修改Notebook的样式。不过这种方式会影响所有标签,更适合批量样式切换的场景。

修正后的完整代码(方案1)

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry('%dx%d+0+0' %(200,200))

style = ttk.Style()
style.theme_use("default")

# Notebook 基础样式配置
style.configure('TNotebook', background='white')
style.configure('TNotebook.Tab', background='white', foreground='black')
style.map('TNotebook.Tab', background=[("selected",'green')])

# 创建Notebook和标签对应的Frame
Book = ttk.Notebook(root)
aFrame = ttk.Frame(Book)
bFrame = ttk.Frame(Book)  # 无需给Frame设置标签样式

# 布局组件
aFrame.pack(fill = tk.BOTH, expand = True)
bFrame.pack(fill = tk.BOTH, expand = True)
Book.pack(fill = tk.BOTH, expand = True)

# 添加标签
Book.add(aFrame, text = 'A')
Book.add(bFrame, text = 'B')

# 单独设置标签B的前景色
Book.tab(bFrame, foreground='red')

root.mainloop()

补充说明

  • ttk.Notebook.tab()方法支持修改单个标签的多种属性,包括text、image、compound、foreground、background等;
  • 如果需要给选中状态的标签也设置特殊颜色,可以结合style.map和事件绑定实现,但单个标签的个性化样式用方案1最简洁高效。

内容的提问来源于Stack Exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:48:23