2016-03-21 7 views
0

Ich versuche eine Tkinter GUI zu erstellen, die einer Variablen einen Wert zuweist, wenn eine Taste gedrückt wird, und dann den Wert zurückgibt der Rest des Codes:Python 3.4.2, die Tkinter-Tasten verwenden, um eine Variable zurückzugeben, die von dem Programm verwendet werden soll

from tkinter import * 

def yes_command(ans): 
    ans = 'yes' 
    window.destroy() 
    return (ans) 

def no_command(ans): 
    ans = 'no' 
    window.destroy() 
    return (ans) 

window = Tk() 

yes_no_label = Label(window, text="Yes or no?") 
yes_no_label.grid(row=0, column=1) 

YESbutton = Button(window, text="Yes", fg='green', command = lambda :yes_command(ans)) 
YESbutton.grid(row=1, column=0) 
NObutton = Button(window, text = 'No', fg = 'red', command= lambda :no_command(ans)) 
NObutton.grid(row=1, column=2) 

window.mainloop() 

print(ans) 

Dabei wird der GUI kommt und sobald eine Taste gedrückt wird, tut es zu schließen. Es wird jedoch nicht ausgegeben (wie dies außerhalb der Funktion, ich weiß, es würde funktionieren, wenn es gedruckt wird).

Was mich weiter verwirrt, ist, dass, wenn ich Rückkehr (am) mit Druck ersetzen (am) es gedruckt wird. Sicherlich bedeutet dies nur, dass der Wert die Funktion nicht verlassen kann. In welchem ​​Fall, warum?

Ich wäre dankbar für jede Hilfe, also danke im Voraus.

+1

Mit 'command = ...' ändert sich 'ans' nicht. Sie speichern 'yes_command (...)' und 'no_command (...)' nicht in einer Variablen und keines ist 'Tkinter.Button'. Es wird * genannt, aber nichts speichert, was es zurückgibt. – zondo

+0

Sie können nicht etwas von einem Callback zurückgeben, da der Code, der die Funktion aufruft ('mainloop()'), zurückgegebene Werte von Callbacks ignoriert. –

Antwort

0

Ich habe eine einfache Lösung für Ihre Frage. Ich benutze eine globale Variable StringVar(). Sie können globale Variable in jeder Funktion festlegen und später drucken.

from Tkinter import * 
def yes_command(): 
    global answer 
    answer.set('yes') 
    window.destroy() 

def no_command(): 
    global answer 
    answer.set('no') 
    window.destroy() 

window = Tk() 

yes_no_label = Label(window, text="Yes or no?") 
yes_no_label.grid(row=0, column=1) 

global answer 
answer=StringVar() 

YESbutton = Button(window, text="Yes", fg='green', command = lambda :yes_command()) 
YESbutton.grid(row=1, column=0) 
NObutton = Button(window, text = 'No', fg = 'red', command= lambda :no_command()) 
NObutton.grid(row=1, column=2) 

window.mainloop() 

print(answer.get()) 
+1

Ihre Antwort wäre besser, wenn Sie die wichtigen Änderungen beschrieben haben. Andernfalls muss der Leser Ihren Code Zeile für Zeile mit dem Original vergleichen. –

+0

ok du hast recht ich werde erklären –

+0

Die drei 'globalen' Anweisungen sind unnötig. Ein globaler Name kann innerhalb einer Funktion erreicht werden, und es gibt keinen Grund für das dritte 'global'. – gil

0

Sie können eine Klasse erstellen und einen globalen Wert von dort behandeln. Ich habe auch eine neue Schaltfläche mit dem Namen Test ans value hinzugefügt, um den Wert ans jedes Mal zu lesen, wenn Sie die Yes oder No Taste drücken. Ich habe auch die Zeilen .destroy() kommentiert, damit Sie überprüfen können, wie es funktioniert.

from tkinter import * 

class UI(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 

     self.ans = '' 
     yes_no_label = Label(window, text="Yes or no?") 
     yes_no_label.grid(row=0, column=1) 

     YESbutton = Button(window, text="Yes", fg='green', command =lambda:self.yes_command()) 
     YESbutton.grid(row=1, column=0) 

     NObutton = Button(window, text = 'No', fg = 'red', command= lambda:self.no_command()) 
     NObutton.grid(row=1, column=2) 

     checkValue = Button(window, text = 'Test ans value', command= lambda:self.test_value()) 
     checkValue.grid(row=2, column=1) 

    def yes_command(self): 
     self.ans = 'yes'  
     #window.destroy() 

    def no_command(self): 
     self.ans = 'no' 
     #window.destroy() 

    def test_value(self): 
     print self.ans  

window = Tk() 
newUI = UI(window) 
window.mainloop() 
0

Danke an alle für die Ideen, habe ich eine einfache Version genommen, getestet es dann, indem sie es nennen, es auf eine Variable hinzufügen, dann, dass die Ausgabe zu testen, ob der Wert erneut zuordnet:

from tkinter import * 

def YNquestion(): 
    global answer 
    def yes_command(): 
     answer.set('yes') 
     window.destroy() 

    def no_command(): 
     answer.set('no') 
     window.destroy() 

    window = Tk() 

    yes_no_label = Label(window, text="Yes or no?") 
    yes_no_label.grid(row=0, column=1) 

    answer=StringVar() 

    YESbutton = Button(window, text="Yes", fg='green', command = lambda :yes_command()) 
    YESbutton.grid(row=1, column=0) 
    NObutton = Button(window, text = 'No', fg = 'red', command= lambda :no_command()) 
    NObutton.grid(row=1, column=2) 

    window.mainloop() 

YNquestion() 
choice = answer.get() 
print(choice) 
YNquestion() 
choice = answer.get() 
print(choice) 

Wenn ich beim ersten Mal Ja und beim zweiten Mal Nein drücke, wird korrekt gedruckt. In dieser Version habe ich die unnötige Verwendung von global entfernt. Es funktioniert perfekt, danke für die Hilfe!