2017-07-05 3 views
0

Meine Absicht ist es, Gui aus mehreren Klassen zu erstellen und als Übung habe ich kleines Beispiel erstellt. Wie in der App zu sehen ist, sollte self.greet aus der Klasse Button erzeugt werden, aber was ich bekomme, ist generische Schaltfläche (ohne Text und Callback-Funktion). Irgendwelche Vorschläge?tkinter Klasse Zusammensetzung funktioniert nicht

import tkinter as tk 
import tkinter.ttk as ttk 

class Button(ttk.Button): 

    def __init__(self, parent): 
     super().__init__(parent) 

     self.item = ttk.Button(parent, text="Greet", command=self.greet) 

    def greet(self): 
     print("Greetings!") 

class App(): 

    def __init__(self, parent):   
     parent.title("A simple GUI") 

     self.label = ttk.Label(parent, text="A label") 
     self.greet = Button(parent) 
     self.button = ttk.Button(parent, text="Close", command=parent.quit) 

     self.label.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.greet.grid(row=1, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.button.grid(row=2, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     parent.grid_columnconfigure(0, weight=1)   

    def greet(self): 
     print("Greetings!") 

if __name__ == "__main__": 
    root = tk.Tk() 
    app = App(root) 
    root.mainloop() 
+0

Wenn Sie _composition_ verwenden, sollten Sie nicht von 'ttk.Button' vererben. Ihre Klasse erstellt tatsächlich zwei Schaltflächen. –

+0

Nun, es ist wahr, dass ich über Konzepte lerne, damit ich sein kann und ich falsch liege. In Bezug auf Ihren Kommentar, wenn ich nicht von 'ttk.Button' wie 'Klasse Button() vererben:' Ich bekomme 'Builtins.TypeError: Objekt .__ Init __() nimmt keine Parameter'? – flebas

Antwort

1

Ihre neue Klasse ist Ein Button, es muss keinen Button enthalten.

class FlebasButton(ttk.Button): 
    def __init__(self, master): 
     super().__init__(master, text="Greet", command=self.greet) 

    def greet(self): 
     print("Greetings!") 

Auch wählen Sie einen anderen Namen als „Button“ für die neue Klasse, so dass Sie (und andere) nicht mit der von tk Klasse verwechseln. Und tkinter verwendet "master" intern für die Elternklasse, daher ist es im Allgemeinen besser, "master" auch für tkinter-Objekte zu verwenden.

1

Instanzen Ihrer Klasse Button sind in der Tat nur allgemeine Tasten ohne Text oder Rückruf. Jede enthält (über ihre self.item Attribut) eine schickere Schaltfläche, aber diese Schaltfläche ist für den Benutzer nie wirklich sichtbar, weil Sie nie packen oder grid es.

Grundsätzlich sollten die Parameter, die Sie an den ttk.Button()-Aufruf übergeben, stattdessen im super().__init__()-Aufruf übergeben werden, sodass sie das Button-Objekt selbst betreffen.