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

已知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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:59:55