2017-08-16 2 views
-2

Ich versuche, mein Programm zu machen, die auf einer Variable in dem Drop-Down-Menü ausgewählt basierend Text ändern, aber die Taste, um den Befehl zu aktivieren, scheint nicht zu funktionieren. Von dem, was ich sehen kann, die Select-Funktion läuft, sobald das Programm geladen ist und dann nie wieder, unabhängig davon, wenn ich auf die Schaltfläche klicke.Tkinter Befehl für Taste funktioniert nicht

from Tkinter import * 

class App: 

    def __init__(self, root): 
     self.title = Label(root, text="Choose a food: ", 
          justify = LEFT, padx = 20).pack() 
     self.label = Label(root, text = "Please select a food.") 
     self.label.pack() 

     self.var = StringVar() 
     self.var.set("Apple") 
     food = ["Apple", "Banana", "Pear"] 
     option = apply(OptionMenu, (root, self.var) + tuple(food)) 
     option.pack() 

     button = Button(root, text = "Choose", command=self.select()) 
     button.pack() 

    def select(self): 
     selection = "You selected the food: " + self.var.get() 
     print(self.var.get()) #debug message 
     self.label.config(text = selection) 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

Ich bin ein Anfänger auf Tkinter, und ich versuche, die Grundlagen, um herauszufinden, bevor ich in der Herstellung meine volle app gehen. Vielen Dank im Voraus :)

Antwort

1

Try button = Button(root, text = "Choose", command=self.select()) zu button = Button(root, text = "Choose", command=self.select) ändern. Beachten Sie die entfernten Klammern nach self.select. Auf diese Weise wird die Methode nur referenziert und nicht wirklich ausgeführt, bis Sie die Schaltfläche drücken.

+0

Danke, das macht eine Menge Sinn. – Rikg09

1

Ihr Hauptproblem ist, dass Sie nicht die Klammern benötigen, wenn command=self.food() Einstellung:

button = Button(root, text="Choose", command=self.select) 

Als Randbemerkung, die Art und Weise erzeugen Sie Ihre OptionMenu etwas ungewöhnlich ist. Sie können die folgenden verwenden, anstatt, die mit dem Rest des Codes konsequenter ist:

option = OptionMenu(root, self.var, *food) 
+0

Danke, deine Antwort hat mein Problem gelöst, aber Noshii hat dich um eine Minute geschlagen, sorry! Und vielen Dank für die Änderung der Menüoptionen. – Rikg09

0

enter image description here Der Befehlsparameter Dokumentation gemäß tkinterbook.

(Eine Funktion oder Methode, die beim Drücken der Schaltfläche aufgerufen wird. Der Rückruf kann eine Funktion, eine gebundene Methode oder ein beliebiges anderes aufrufbares Python-Objekt sein. Wenn diese Option nicht verwendet wird, geschieht nichts, wenn der Benutzer die Taste drückt Taste.)

***************************** modifizierten Code ************ *******************

from Tkinter import * 

class App: 

    def __init__(self, root): 
     self.title = Label(root, text="Choose a food: ", 
          justify = LEFT, padx = 20).pack() 
     self.label = Label(root, text = "Please select a food.") 
     self.label.pack() 

     self.var = StringVar() 
     self.var.set("Apple") 
     food = ["Apple", "Banana", "Pear"] 
     option = apply(OptionMenu, (root, self.var) + tuple(food)) 
     option.pack() 

     button = Button(root, text = "Choose", command=self.select) 
     #use function name instead of aclling the function 
     button.pack() 

    def select(self): 
     selection = "You selected the food: " + self.var.get() 
     print(selection) #debug message 
     self.label.config(text = selection) 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 
Verwandte Themen