2012-10-30 33 views
12

Có ai biết nếu đã có một widget/lớp để xử lý mở rộng/ký hợp đồng một khung dựa trên một nút toggled (checkbutton) trong tkinter/ttk?Khung mở rộng và hợp đồng trong Tkinter

Câu hỏi này xuất phát từ nỗ lực của tôi để dọn dẹp một gui lộn xộn có nhiều tùy chọn được phân loại theo các hành động cụ thể. Tôi muốn một cái gì đó dọc theo dòng:

enter image description here
dụ được tìm thấy trên google

Tuy nhiên thay vì chỉ văn bản, cho phép các nút, mục, bất kỳ widget Tkinter của. Nếu điều này không tồn tại, nó sẽ có thể/hữu ích để tạo ra một lớp kế thừa Frame Tkinter:

import tkinter as tk 
import ttk 

class toggledFrame(tk.Frame): 
    def __init__(self): 
     self.show=tk.IntVar() 
     self.show.set(0) 
     self.toggleButton=tk.Checkbutton(self, command=self.toggle, variable=self.show) 
     self.toggleButton.pack() 
     self.subFrame=tk.Frame(self) 

    def toggle(self): 
     if bool(self.show.get()): 
      self.subFrame.pack() 
     else: 
      self.subFrame.forget() 

Lưu ý: mã này là chưa được kiểm tra, chỉ trình bày các khái niệm

Trả lời

15

Tôi thực sự ngạc nhiên về mức độ gần gũi của việc nhận mã hoạt động. Tôi quyết định làm việc trên nó một số chi tiết và có phát triển một lớp học nhỏ đơn giản để thực hiện chính xác những gì tôi muốn (ý kiến ​​đóng góp về các mã được hoan nghênh):

import tkinter as tk 
from tkinter import ttk 


class ToggledFrame(tk.Frame): 

    def __init__(self, parent, text="", *args, **options): 
     tk.Frame.__init__(self, parent, *args, **options) 

     self.show = tk.IntVar() 
     self.show.set(0) 

     self.title_frame = ttk.Frame(self) 
     self.title_frame.pack(fill="x", expand=1) 

     ttk.Label(self.title_frame, text=text).pack(side="left", fill="x", expand=1) 

     self.toggle_button = ttk.Checkbutton(self.title_frame, width=2, text='+', command=self.toggle, 
              variable=self.show, style='Toolbutton') 
     self.toggle_button.pack(side="left") 

     self.sub_frame = tk.Frame(self, relief="sunken", borderwidth=1) 

    def toggle(self): 
     if bool(self.show.get()): 
      self.sub_frame.pack(fill="x", expand=1) 
      self.toggle_button.configure(text='-') 
     else: 
      self.sub_frame.forget() 
      self.toggle_button.configure(text='+') 


if __name__ == "__main__": 
    root = tk.Tk() 

    t = ToggledFrame(root, text='Rotate', relief="raised", borderwidth=1) 
    t.pack(fill="x", expand=1, pady=2, padx=2, anchor="n") 

    ttk.Label(t.sub_frame, text='Rotation [deg]:').pack(side="left", fill="x", expand=1) 
    ttk.Entry(t.sub_frame).pack(side="left") 

    t2 = ToggledFrame(root, text='Resize', relief="raised", borderwidth=1) 
    t2.pack(fill="x", expand=1, pady=2, padx=2, anchor="n") 

    for i in range(10): 
     ttk.Label(t2.sub_frame, text='Test' + str(i)).pack() 

    t3 = ToggledFrame(root, text='Fooo', relief="raised", borderwidth=1) 
    t3.pack(fill="x", expand=1, pady=2, padx=2, anchor="n") 

    for i in range(10): 
     ttk.Label(t3.sub_frame, text='Bar' + str(i)).pack() 

    root.mainloop() 

Mã này sản xuất:
enter image description here

+1

Có ai biết nếu có nơi nào đó đang thu thập các tiện ích tùy chỉnh này để người khác sử dụng không? – Onlyjus

+0

Có một danh sách ở đây: http://tkinter.unpythonic.net/wiki/Widgets – Gonzo

+0

@Gonzo liên kết đó đã chết. Bạn có biết gương nào không? – Plasma

0

Theo hiểu biết của tôi , Tkinter/ttk không cung cấp các tiện ích như vậy. Bạn có thể bắt chước ví dụ của mình (mở rộng/thu gọn nhãn danh sách) với một số tkinter.ttk.Treeview.

Hoàn toàn có thể chấp nhận 1 để phát triển tiện ích của riêng bạn và mã của bạn có vẻ là một khởi đầu đúng đắn.

+0

Cảm ơn . Tôi đã sử dụng treeview trước đây nhưng nó không phải là những gì tôi đang tìm kiếm. – Onlyjus

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