tkinter.ttk使用theme_create继承clam主题后按钮未应用样式的问题
tkinter.ttk使用theme_create继承clam主题后按钮未应用样式的问题
嗨,这个问题我在MacOS上用ttk自定义主题时也碰到过,确实挺让人困惑的——明明指定了clam作为父主题,结果按钮还是默认的白方块,Notebook却正常继承了样式。
这其实是MacOS平台下tkinter.ttk主题系统的一个小“坑”:当你用theme_create()创建自定义主题并指定父主题时,并不是所有部件的样式都会自动继承过来。尤其是按钮这类在Mac上有原生样式优先级的部件,ttk不会默认把父主题的样式完全套用过来,除非你明确指定。而直接用theme_use("clam")的时候,ttk会加载完整的clam主题包,所有部件的样式都会被正确应用。
解决办法很简单,就是在创建自定义主题后,通过theme_settings()显式地让按钮部件继承clam主题的样式配置和状态映射。这里给你修改了代码,亲测在Mac上有效:
from tkinter import Tk from tkinter.ttk import Button, Style root = Tk() style = Style() # 创建自定义主题,指定父主题为clam style.theme_create("user_theme", parent="clam") # 显式将clam主题的TButton样式配置和映射复制到自定义主题中 style.theme_settings("user_theme", { "TButton": { "configure": style.lookup("clam.TButton", "configure"), "map": style.lookup("clam.TButton", "map") } }) style.theme_use("user_theme") btn = Button(root, text="Button") btn.pack() root.mainloop()
style.lookup()方法可以获取到clam主题下TButton的配置参数(比如背景色、字体等)和状态映射(比如hover、按下时的样式变化),把这些内容赋值给自定义主题的TButton,按钮就会显示clam主题的米色样式了。如果你后续还要修改按钮的样式,直接在theme_settings()里覆盖对应的参数就好,不会影响继承来的其他样式。
备注:内容来源于stack exchange,提问作者TRCK
相关产品推荐
相关产品推荐

