已知ttk样式名称时如何获取对应的样式对象?
问题描述
我刚开始使用ttk Styles,想搞懂一个原理性问题:仅知道样式名称时,如何找到对应的样式对象并读取其样式属性?
我已经实现了直接通过Style对象调用lookup()获取属性的代码(运行后会输出背景色yellow):
import tkinter as tk from tkinter import ttk tk_win = tk.Tk() tk_win.geometry('400x200+100+100') style = ttk.Style() style.configure('Style_name.TLabel', foreground='blue', background="yellow") label = ttk.Label(tk_win, text = 'Just a Test_Label', style = 'Style_name.TLabel') label.place(x=10, y=10) print(style.lookup('Style_name.TLabel', 'background')) tk_win.mainloop()
但将逻辑封装到函数时遇到了困难:从Label的['style']属性只能拿到样式名称的字符串,不知道如何通过这个字符串调用lookup()。我不想用额外传递样式对象、创建名称与对象的映射字典这类迂回方法,希望能直接从Label出发解决问题。我的运行环境是Ubuntu 22.04、Python 3.10.12。
解决方案
ttk的Style对象本质是和Tk应用实例绑定的,所有Style实例共享同一个全局样式数据库——你不需要“获取”某个特定的样式对象,只需要在函数中创建一个新的Style实例(或者关联到Label的主窗口创建),然后用拿到的样式名称调用lookup()即可。
修改后的完整代码如下:
import tkinter as tk from tkinter import ttk def get_bg(inp_label): style_name = inp_label['style'] # 方式1:直接创建Style实例,自动关联当前Tk应用 style = ttk.Style() # 方式2:通过Label的主窗口创建Style,更严谨(避免多窗口场景出错) # style = ttk.Style(inp_label.winfo_toplevel()) return style.lookup(style_name, 'background') tk_win = tk.Tk() tk_win.geometry('400x200+100+100') style = ttk.Style() style.configure('Style_name.TLabel', foreground='blue', background="yellow") label = ttk.Label(tk_win, text='Just a Test_Label', style='Style_name.TLabel') label.place(x=10, y=10) print(get_bg(label)) tk_win.mainloop()
原理说明
ttk的样式配置是存储在Tk应用的全局样式数据库中的,所有基于同一个Tk实例创建的Style对象,都能访问和操作这个数据库。所以不管你在代码的哪个位置创建Style实例,只要样式名称存在,就能通过lookup()查询到对应的属性值,不需要专门保存或传递最初创建的那个Style对象。
内容的提问来源于stack exchange,提问作者Nitram
相关产品推荐
相关产品推荐

