如何知道ttk小部件的所有样式选项

问题描述 投票:6回答:2

这个问题几乎让我兴奋不已。我是一个新的初学者,不知道tck / tk。我已经在互联网上仔细搜索,但没有找到一个很好的解决方案。

例如,我使用了创建标签框架

import tkinter as tk
from tkinter import ttk
newBT = ttk.LabelFrame(width=100, height=100)

然后我需要设置框架样式。 tk.LabelFrame有前景。但是,我没有在NMTtck/tk参考上找到ttk.LabelFrame的这种样式选项。然后我必须猜测,如下

s = ttk.Style()
s.configure('TLabelframe', foreground='red')

但这不起作用,the right thing

s.configure('TLabelframe.Label', foreground='red')

所以,我的问题是,我怎样才能找到ttk小部件的所有样式选项。是否有一些功能

s.getAllOptions('TLabelframe')

然后输出就像

['background', 'foreground', 'padding', 'border', ...]

谢谢!

tkinter ttk
2个回答
3
投票

我发现你的问题很有趣,因为我问自己同样的问题,但直到现在还没有时间来解决它。我写了一个名为stylename_elements_options(stylename)的函数来做这件事。在这里分享。希望它能让你受益(尽管已经晚了6个月),并且任何tkinter用户都会问同样的问题。

脚本:

import tkinter as tk
import tkinter.ttk as ttk

def stylename_elements_options(stylename):
    '''Function to expose the options of every element associated to a widget
       stylename.'''
    try:
        # Get widget elements
        style = ttk.Style()
        layout = str(style.layout(stylename))
        print('Stylename = {}'.format(stylename))
        print('Layout    = {}'.format(layout))
        elements=[]
        for n, x in enumerate(layout):
            if x=='(':
                element=""
                for y in layout[n+2:]:
                    if y != ',':
                        element=element+str(y)
                    else:
                        elements.append(element[:-1])
                        break
        print('\nElement(s) = {}\n'.format(elements))

        # Get options of widget elements
        for element in elements:
            print('{0:30} options: {1}'.format(
                element, style.element_options(element)))

    except tk.TclError:
        print('_tkinter.TclError: "{0}" in function'
              'widget_elements_options({0}) is not a regonised stylename.'
              .format(stylename))

stylename_elements_options('my.Vertical.TScrollbar')

2
投票

问题是,如果您真的想要详细控制样式,则需要使用布局。首先使用以下方法识别小部件类:

>>b=ttk.Button(None)
>>b.winfo_class()
'TButton

然后使用该命令

>>> s.layout('TButton')
[("Button.border", {"children": [("Button.focus", {"children": 
[("Button.spacing",
{"children": [("Button.label", {"sticky": "nswe"})], "sticky": "nswe"})], 
"sticky": "nswe"})], "sticky": "nswe", "border": "1"})] 

最后改变你想要的东西:

s.layout("MYButton.TButton",[("Button.border", {"children": 
[("Button.focus", {"children": [("Button.spacing", {"children": 
[("Button.label", {"sticky": "nswe"})], "sticky": "nswe"})], "sticky": 
"nswe"})], "sticky": "we", "border": "1"})]

这为我提供了诀窍,最后为我提供了一种控制我的ttk小部件的方法!

卢卡

© www.soinside.com 2019 - 2024. All rights reserved.