微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建与“Clam”式ttk主题相同的自定义ttk样式特定于按钮小部件

如何解决创建与“Clam”式ttk主题相同的自定义ttk样式特定于按钮小部件

使用此代码

import Tkinter as tk
import ttk

def get_element_details(style):
    print('element: %s' % style)
    print('option: %s' % str(s.element_options(style)))
    layout = s.layout(style)
    for elem, elem_dict in layout:
        get_sub_element_details(elem, elem_dict)
    print(layout)

def get_sub_element_details(elem, _dict, depth=1):
    print('%selement: %s' % (''.join(['\t' for i in range(depth)]), elem))
    for key in _dict:
        if key != 'children':
            print('%s%s: %s' % (''.join(['\t' for i in range(depth+1)]), key, _dict[key]))
    print('%soption: %s' % (''.join(['\t' for i in range(depth+1)]), s.element_options(elem)))
    if 'children' in _dict:
        for child, child_dict in _dict['children']:
            get_sub_element_details(child, child_dict, depth+1)

root = tk.Tk()
widget = ttk.Button(root, text='test')
widget.grid(sticky='nesw')

style = widget.winfo_class()

s = ttk.Style()

print(s.theme_use())
print('normal theme')
get_element_details(style)

print('\nclam theme')
s.theme_use('clam')
get_element_details(style)

您可以提供有关小部件的所有布局和配置选项的详细信息。在本机(xp)上使用本机主题,我得到以下输出

element: TButton
option: ()
    element: Button.button
        sticky: nswe
        option: ()
        element: Button.focus
            sticky: nswe
            option: ()
            element: Button.padding
                sticky: nswe
                option: ('-padding', '-relief', '-shiftrelief')
                element: Button.label
                    sticky: nswe
                    option: ('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

并以蛤为主题,我得到:

element: TButton
option: ()
    element: Button.border
        border: 1
        sticky: nswe
        option: ('-bordercolor', '-lightcolor', '-darkcolor', '-relief', '-borderwidth')
        element: Button.focus
            sticky: nswe
            option: ('-focuscolor', '-focusthickness')
            element: Button.padding
                sticky: nswe
                option: ('-padding', '-relief', '-shiftrelief')
                element: Button.label
                    sticky: nswe
                    option: ('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

请注意,clam主题Button.border元素带有选项,而本机主题Button.button元素带有选项。

您可以从clam主题中保存布局(在编写时,或者可以在运行时通过加载clam主题获取布局然后切换回主题并重新加载布局来获取布局),然后使用该样式来设置按钮的样式。

理论上,这应该工作:

import Tkinter as tk
import ttk

root = tk.Tk()

style = 'TButton'

s = ttk.Style()

#s.theme_use('clam')

#get_element_details(style)

clambuttonlayout = [('Button.border', {'border': '1', 'children': [('Button.focus', {'children': [('Button.padding', {'children': [('Button.label', {'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})]

s.layout('clam.TButton', clambuttonlayout)

b1 = ttk.Button(root, text="Button 1", style='clam.TButton')
b1.grid()
b2 = ttk.Button(root, text="Button 2", style='TButton')
b2.grid()

root.mainloop()

但是由于某种原因,当我执行此操作时,该文本将不再出现在第一个按钮上…如果我知道了,我将再次进行编辑。

解决方法

我需要使用ttk’clam’主题为按钮小部件创建一个与按钮外观相同的自定义样式。

我可以将主题设置为:

s = ttk.Style()
s.theme_use('clam')

但是,鉴于主题的性质,这会将所有ttk小部件设置为使用“Clam”。

我希望能够将某些ttk按钮设置为使用蛤appearance外观,而其他设置为使用默认的ttk。

我在尝试使用蛤theme主题时尝试查看“ TButton”的布局和配置,但似乎主题是样式的集合,我不确定如何根据Clambutton按钮样式“映射”自定义样式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。