2012-10-30 14 views
12

Weiß jemand, ob es schon ein Widget/eine Klasse gibt, um einen Rahmen auszudehnen/zu kontrahieren, der auf einer umschaltbaren Schaltfläche (Checkbutton) in tkinter/ttk basiert?Erweiterbarer und kontrahierbarer Rahmen in Tkinter

Diese Frage ergibt sich aus meinem Versuch, eine überladene GUI zu bereinigen, die viele durch bestimmte Aktionen kategorisierte Optionen hat. Ich würde etwas entlang der Linien von mag:

enter image description here
Beispiel auf Google gefunden

jedoch statt nur Text, lassen für Knöpfe, Einträge, jeder tkinter des Widgets. Wenn dies nicht bereits vorhanden ist, wäre es möglich/sinnvoll sein, um eine Klasse zu erstellen, die den tkinter Rahmen erbt:

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() 

Hinweis: Dieser Code ist nicht getestet, nur Konzept präsentiert

Antwort

15

Ich bin eigentlich überrascht, wie nah ich war, funktionierenden Code zu bekommen. Ich entschied mich für eine einfache kleine Klasse etwas mehr zu arbeiten und entwickeln genau auszuführen, was ich wollte (Kommentare und Vorschläge auf dem Code sind willkommen):

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() 

Dieser Code erzeugt:
enter image description here

+1

Weiß jemand, ob es einen Ort gibt, an dem diese benutzerdefinierten Widgets für andere Benutzer gesammelt werden? – Onlyjus

+0

Es gibt eine Liste hier: http://tkinter.unpythonic.net/wiki/Widgets – Gonzo

+0

@ Gonzo, dass der Link ist tot. Kennst du irgendwelche Spiegel? – Plasma

0

Mein Wissen Tkinter/ttk stellt solche Widgets nicht zur Verfügung. Sie könnten Ihr Beispiel nachahmen (erweitern/reduzieren label Liste) mit einem tkinter.ttk.Treeview.

Es ist vollkommen akzeptabel 1, um Ihre eigenen Widgets zu entwickeln, und Ihr Code scheint ein richtiger Start.

+0

Dank . Ich habe schon vorher Baumansichten verwendet, aber es ist nicht das, wonach ich suche. – Onlyjus

Verwandte Themen