2017-07-29 225 views
5

这个问题几乎让我狂热。我是一个新手,不知道tck/tk。我在互联网上仔细搜索过,但还没有找到一个好的解决方案。如何知道ttk部件的所有样式选项

例如,我创建使用

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

然后,我需要设置框架风格的标签帧。有前景tk.LabelFrame。但是,我没有找到ttk.LabelFrameNMTtck/tk参考的这种样式选项。然后我猜的话,像以下

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', ...] 

谢谢!

+1

我想我找到一个解决方案。首先,使用's.layout('TLabelframe')'来找出这个小部件的所有元素。其次,使用's.element_options('element name')'来找出所有可用的选项。不幸的是,我还没有找到如何获得** TLabelframe.Label **,因为's.layout('TLabelframe')'不会输出这个。它似乎不是ttk.Labelframe的元素。 –

+1

我正在寻找类似的东西。看起来好像可以使用'widget.configure()'调用,不带参数,并获得一个可用其名称查找样式的属性列表。使用名称样式,您可以创建一个tk样式并检索其颜色。我要试试这种方式 – madtyn

+1

谢谢madtyn。你是对的.configure()没有参数会告诉你属性和当前设置。但是,这不会给你可以设定的风格。 –

回答

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小部件的方法!

卢卡

+0

这是我的问题的一个很好的答案。顺便说一句,用's.element_options()'你可以看到你可以为布局元素设置什么选项。 –

2

,我发现你的问题有趣,因为我曾问自己同样的问题,但还没有找到时间来解决这个问题到现在为止。我写了一个叫做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') 
+0

谢谢,这真的很有帮助 –

相关问题