Tkinter 如何了解ttk小部件的所有样式选项
这个问题几乎让我发疯。我是一个新的初学者,没有tck/tk知识。我在互联网上仔细搜索过,但没有找到好的解决方案 例如,我使用创建了一个标签框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
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')