这个问题几乎让我开心。我是一个新的初学者,不知道tck / tk。我已经在互联网上仔细搜索,但没有找到一个好的解决方案。
例如,我使用
创建了一个标签框架import tkinter as tk
from tkinter import ttk
newBT = ttk.LabelFrame(width=100, height=100)
然后我需要设置框架样式。 tk.LabelFrame 有前景。但是,我没有在NMT和tck/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', ...]
谢谢!
答案 0 :(得分: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')
答案 1 :(得分:2)
问题在于,如果您真的想要详细控制样式,则需要使用布局。因此,首先使用以下方法识别窗口小部件类:
0
然后使用命令
>>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"})]
这为我提供了技巧,最后为我提供了一种控制我的ttk小部件的方法!!!
卢卡
答案 2 :(得分:0)
基于SunBear的脚本:
import tkinter as tk
import tkinter.ttk as ttk
def iter_layout(layout, tab_amnt=0, elements=[]):
"""Recursively prints the layout children."""
el_tabs = ' '*tab_amnt
val_tabs = ' '*(tab_amnt + 1)
for element, child in layout:
elements.append(element)
print(el_tabs+ '\'{}\': {}'.format(element, '{'))
for key, value in child.items():
if type(value) == str:
print(val_tabs + '\'{}\' : \'{}\','.format(key, value))
else:
print(val_tabs + '\'{}\' : [('.format(key))
iter_layout(value, tab_amnt=tab_amnt+3)
print(val_tabs + ')]')
print(el_tabs + '{}{}'.format('} // ', element))
return elements
def stylename_elements_options(stylename, widget):
"""Function to expose the options of every element associated to a widget stylename."""
try:
# Get widget elements
style = ttk.Style()
layout = style.layout(stylename)
config = widget.configure()
print('{:*^50}\n'.format(f'Style = {stylename}'))
print('{:*^50}'.format('Config'))
for key, value in config.items():
print('{:<15}{:^10}{}'.format(key, '=>', value))
print('\n{:*^50}'.format('Layout'))
elements = iter_layout(layout)
# Get options of widget elements
print('\n{:*^50}'.format('element options'))
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))
widget = ttk.Button(None)
class_ = widget.winfo_class()
stylename_elements_options(class_, widget)
打印配置选项和布局树。