2017-07-29 63 views
5

Bu sorun neredeyse beni çıldırtıyor. Yeni başlayan ve tck/tk bilgisi olmayan biriyim. İnternette dikkatli bir şekilde arama yaptım, ancak iyi bir çözüm bulamadım.Bir ttk widget'inin tüm stil seçeneklerini nasıl öğrenirim?

Mesela ben

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

Sonra çerçeve stilini ayarlamak gerekir kullanarak bir etiket çerçeve oluşturdu. tk.LabelFrame için ön plan bulunmaktadır. Ancak, ttk.LabelFrame için NMT ve tck/tk başvuruları için böyle bir stil seçeneği bulamadık. Sonra

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

aşağıdaki gibi tahmin edilmesi var ama bu işe yaramazsa, the right thing Bir ttk Widget sahip olduğu tüm stil seçenekleri öğrenmek için aşağıdaki adımlar, benim sorum,

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

Yani olduğunu .

s.getAllOptions('TLabelframe') 

gibi bazı işlevi var mı ve sonra çıkış

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

Teşekkür gibi bir şey!

+1

ben bir çözüm bulmak düşünüyorum. İlk olarak, bu widget'in tüm öğelerini bulmak için 's.layout ('TLabelframe')' kullanın. İkinci olarak, tüm seçenekleri bulmak için 's.element_options ('öğe adı')' kullanın. Ne yazık ki, ** TLabelframe.Label ** nasıl elde edildiğini bulamadım çünkü 's.layout ('TLabelframe')' bunu vermiyor. Ttk.Labelframe öğesinin bir öğesi değil gibi görünüyor. –

+1

Benzer bir şey arıyorum. Parametre olmaksızın 'widget.configure()' çağrısını kullanabilir ve stilini ismiyle birlikte bulabileceğiniz özelliklerin listesini alabilirsiniz. İsim stilini kullanarak bir tk stili oluşturabilir ve rengini alabilirsiniz. Ben bu şekilde deneyeceğim – madtyn

+1

Teşekkürler madtyn. Haklısınız, argüman olmadan .configure() özellikleri ve geçerli ayarları söyleyecektir. Ancak, bu size ayarlayabilirsiniz stil vermez. –

cevap

2

Sorun şu ki, bir stili gerçekten kontrol etmek istiyorsanız, düzeni kullanmanız gerekir.

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

Sonra Nihayet istediğini değiştirmek komutu

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

kullanmak: Yani ilk kullanan Widget sınıfını tanımlamak Bu benim için hile yaptı

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

ve sonunda beni bir sağlar ttk widget'ımı kontrol etme yolu! Ben kendime aynı soruyu sormuştu ama şu ana kadar yanıt vermek için zaman bulamadı olarak

Luca

+0

Bu benim soruma iyi bir cevap. BTW, s.element_options() ile bir düzen öğesi için hangi seçenekleri belirleyebilirsiniz. –

2

Ben senin soru ilginç buldum. Sadece bunu yapmak için stylename_elements_options(stylename) adlı bir işlev yazdım. Burada paylaşıyorum. Umarım size (6 aylık geç olmasına rağmen) ve aynı soruyu soran kullanıcılardan yararlanabilir.

Senaryo:

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

Teşekkürler bu gerçekten yardımcı oluyor –