2017-07-29 15 views
5

Sự cố này gần như khiến tôi bị sốt. Tôi là người mới bắt đầu và không có kiến ​​thức về tck/tk. Tôi đã thực hiện tìm kiếm trên internet một cách cẩn thận nhưng chưa tìm được giải pháp tốt.cách biết tất cả các tùy chọn kiểu dáng của tiện ích ttk

Ví dụ, tôi tạo ra một khung nhãn sử dụng

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

Sau đó, tôi cần phải thiết lập các kiểu khung. Có tiền cảnh cho tk.LabelFrame. Tuy nhiên, tôi không tìm thấy tùy chọn kiểu như vậy đối với tham chiếu ttk.LabelFrame trên NMTtck/tk. Sau đó, tôi phải đoán, như sau

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

Nhưng điều này không làm việc, the right thing

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

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể tìm hiểu tất cả các tùy chọn phong cách một widget TTK có . Có một số chức năng như

s.getAllOptions('TLabelframe') 

và sau đó đầu ra là một cái gì đó giống như

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

Cảm ơn!

+1

Tôi nghĩ tôi tìm một giải pháp. Đầu tiên, sử dụng 's.layout ('TLabelframe')' để tìm ra tất cả các phần tử của widget này. Thứ hai, sử dụng 's.element_options ('tên phần tử')' để tìm ra tất cả các tùy chọn có sẵn. Thật không may, tôi đã không tìm ra cách để có được ** TLabelframe.Label ** vì 's.layout ('TLabelframe')' không xuất ra điều này. Có vẻ như không phải là một phần tử của ttk.Labelframe. –

+1

Tôi đang tìm một cái gì đó tương tự. Có vẻ như người ta có thể sử dụng 'widget.configure()' gọi, không có tham số và nhận danh sách các thuộc tính mà trong đó bạn tìm thấy kiểu dáng với tên của nó. Sử dụng kiểu tên, bạn có thể tạo kiểu tk và lấy màu của nó. Tôi sẽ thử theo cách đó – madtyn

+1

Cảm ơn madtyn. Bạn đang đúng .configure() không có đối số sẽ cho bạn biết thuộc tính và cài đặt hiện tại. Tuy nhiên, điều đó sẽ không cung cấp cho bạn phong cách bạn có thể đặt. –

Trả lời

2

Vấn đề là nếu bạn thực sự muốn kiểm soát kiểu chi tiết, bạn cần sử dụng bố cục. Vì vậy, lần đầu tiên xác định các lớp phụ tùng sử dụng:

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

Sau đó sử dụng lệnh

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

Cuối cùng thay đổi những gì bạn muốn:

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

Điều này làm các trick cho tôi và cuối cùng là cung cấp cho tôi một cách kiểm soát tiện ích ttk của tôi !!!

Luca

+0

Đây là câu trả lời hay cho câu hỏi của tôi. BTW, với 's.element_options()' bạn có thể thấy những tùy chọn nào bạn có thể thiết lập cho một phần tử layout. –

2

Tôi thấy câu hỏi của bạn thú vị vì tôi đã tự hỏi mình cùng một câu hỏi nhưng chưa tìm thấy thời gian để giải quyết nó cho đến bây giờ. Tôi đã viết một hàm có tên là stylename_elements_options(stylename) để làm điều này. Chia sẻ nó ở đây. Hy vọng nó có thể mang lại lợi ích cho bạn (mặc dù nó là 6 tháng cuối) và bất kỳ người dùng tkinter hỏi cùng một câu hỏi.

Script:

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

Cảm ơn điều này thực sự hữu ích –

Các vấn đề liên quan