2017-07-29 28 views
5

Ten problem prawie sprawia, że ​​szaleję. Jestem nowym początkującym i bez wiedzy o tck/tk. Starannie wyszukiwałem w Internecie, ale nie znalazłem dobrego rozwiązania.jak poznać wszystkie opcje stylu widżetu ttk

Na przykład, stworzyłem ramki etykiety przy użyciu

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

Potem trzeba ustawić styl ramki. Na pierwszym planie jest tk.LabelFrame. Jednak nie znalazłem takiego stylu opcji dla ttk.LabelFrame na NMT i tck/tk odniesienia. Wtedy muszę zgadywać, jak po

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

Ale to nie działa, the right thing jest

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

Więc moje pytanie brzmi: w jaki sposób można znaleźć wszystkie opcje stylu widget TTK ma . Czy istnieje jakaś funkcja jak

s.getAllOptions('TLabelframe') 

a następnie wyjście jest coś

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

dzięki!

+1

myślę znaleźć rozwiązanie. Najpierw użyj 's.layout ('TLabelframe')', aby znaleźć wszystkie elementy tego widgetu. Po drugie, użyj 's.element_options ('nazwa elementu')', aby znaleźć wszystkie dostępne opcje. Niestety, nie dowiedziałem się, jak uzyskać ** TLabelframe.Label **, ponieważ 's.layout ('TLabelframe')' nie wyprowadza tego. Wydaje się, że nie jest to element ttk.Labelframe. –

+1

Szukam czegoś podobnego. Wygląda na to, że można użyć wywołania 'widget.configure()' bez parametrów i uzyskać listę właściwości, w których można znaleźć styl z jego nazwą. Używając stylu nazwy, możesz stworzyć styl tk i pobrać jego kolor. Spróbuję w ten sposób – madtyn

+1

Dzięki madtyn. Masz rację .configure() bez argumentu powie Ci właściwości i bieżące ustawienia. To jednak nie da ci stylu, który możesz ustawić. –

Odpowiedz

2

Problem polega na tym, że jeśli naprawdę chcesz kontrolować styl w szczegółach, musisz użyć układu. Więc najpierw zidentyfikować klasę widget przy użyciu:

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

Następnie użyj polecenia

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

końcu zmienić to, co chcesz:

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"})] 

To sprawiło lewę dla mnie i wreszcie zapewnia mnie sposób kontrolowania mojego widżetu ttk !!!

Luca

+0

To jest dobra odpowiedź na moje pytanie. BTW, z 's.element_options()' możesz zobaczyć, jakie opcje możesz ustawić dla elementu layoutu. –

2

znalazłem swoje pytanie ciekawe jak ja zadawałem sobie to samo pytanie, ale nie znalazłem czasu, aby skierował ją do tej pory. Napisałem funkcję o nazwie stylename_elements_options(stylename), aby to zrobić. Udostępniam to tutaj. Mam nadzieję, że może przynieść ci korzyść (mimo że spóźni się o 6 miesięcy) i wszyscy użytkownicy tkintera zadają to samo pytanie.

Scenariusz:

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

Dzięki temu jest to bardzo pomocne –