Tkinter 如何了解ttk小部件的所有样式选项

Tkinter 如何了解ttk小部件的所有样式选项,tkinter,ttk,Tkinter,Ttk,这个问题几乎让我发疯。我是一个新的初学者,没有tck/tk知识。我在互联网上仔细搜索过,但没有找到好的解决方案 例如,我使用创建了一个标签框 import tkinter as tk from tkinter import ttk newBT = ttk.LabelFrame(width=100, height=100) 然后我需要设置框架样式。tk.LabelFrame有前景。但是,我没有为ttk.LabelFrame和reference找到这样的样式选项。然后我不得不猜测,就像下面这样 s

这个问题几乎让我发疯。我是一个新的初学者,没有tck/tk知识。我在互联网上仔细搜索过,但没有找到好的解决方案

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

import tkinter as tk
from tkinter import ttk
newBT = ttk.LabelFrame(width=100, height=100)
然后我需要设置框架样式。tk.LabelFrame有前景。但是,我没有为ttk.LabelFrame和reference找到这样的样式选项。然后我不得不猜测,就像下面这样

s = ttk.Style()
s.configure('TLabelframe', foreground='red')
但这不管用,是吗

所以,我的问题是,如何找到一个ttk小部件拥有的所有样式选项。是否有类似的功能

s.getAllOptions('TLabelframe')
然后输出类似于

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

谢谢

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

>>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小部件


卢卡

我发现你的问题很有趣,因为我曾经问过自己同样的问题,但直到现在才抽出时间来回答。为此,我编写了一个名为
stylename\u elements\u 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')

基于SunBear的脚本:

将tkinter作为tk导入
将tkinter.ttk导入为ttk
定义布局(布局,选项卡名称=0,元素=[]):
“”“递归打印布局子项。”“”
el_tabs=''*tab_amnt
val_tabs=''*(tab_amnt+1)
对于元素,布局中的子元素:
元素。追加(元素)
打印(el_tabs+'\'{}\':{}'。格式(元素'{'))
对于键,子.items()中的值:
如果类型(值)==str:
打印(val_tabs+'\'{}\':'{}\','.format(key,value))
其他:
打印(val_制表符+'\'{}\':[('.格式(键))
iter布局(值,tab\u amnt=tab\u amnt+3)
打印(val_制表符+')]')
打印(el_tabs+'{}{}'。格式('}/',元素))
返回元素
def stylename_元素_选项(stylename,小部件):
“”“函数公开与小部件样式名关联的每个元素的选项。”“”
尝试:
#获取小部件元素
style=ttk.style()
布局=样式。布局(样式名称)
config=widget.configure()
打印(“{**^50}\n.”格式(f'Style={stylename})
打印(“{**^50}”。格式('Config'))
对于键,config.items()中的值:
打印(“{:”,值))
打印('\n{:^50}'。格式('Layout'))
元素=iter\U布局(布局)
#获取小部件元素的选项
打印('\n{:^50}'。格式('element options'))
对于元素中的元素:
打印({0:30}选项:{1})。格式(
元素,样式。元素_选项(元素)))
除了tk.TclError:
打印('\u tkinter.TclError:“{0}”在函数中'
'widget_elements_options({0})不是正则化的样式名。'
.format(样式名))
widget=ttk.按钮(无)
类=widget.winfo_类()
样式名\元素\选项(类\小部件)

打印配置选项以及布局树。

我想我找到了一个解决方案。首先,使用
s.layout('TLabelframe')
查找此小部件的所有元素。其次,使用
s.element\u选项('element name'))
查找所有可用选项。不幸的是,我还没有找到如何获取TLabelframe.Label,因为
s.layout('TLabelframe')
没有输出它。它似乎不是ttk.Labelframe的元素。我正在寻找类似的东西。似乎可以使用
widget.configure()
调用,不带参数,并获取属性列表,在其中可以找到带有名称的样式。使用名称样式,您可以创建tk样式并检索其颜色。我将尝试这种方法。谢谢madtyn。您是对的。configure()没有参数会告诉你属性和当前设置。但是,这不会给你你可以设置的样式。我仍在寻找答案。我已经做了很多。这是我问题的一个很好的答案。顺便说一句,使用
s.element\u options()
你可以看到你可以为布局元素设置哪些选项。谢谢这真的很有帮助你是这个答案的英雄!非常有帮助,谢谢!真正的MVP!谢谢百万朋友,这非常简单。这是最好的答案!
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')