2016-03-21 102 views
0

我想创建一个tkinter GUI,它在按下按钮时给一个变量赋值,然后返回该值用于代码的其余部分:Python 3.4.2,使用Tkinter按钮返回一个变量供程序使用

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) 

在此,GUI出现,一旦按下按钮,它就会关闭。然而,它不输出(因为这被称为函数的外部,我知道它将工作,如果它打印)。

什么进一步混淆我是,如果我是来取代回报(ANS)打印(ANS)它将打印。这当然意味着它不会允许这个值离开函数吗?在这种情况下,为什么?

我会感谢任何帮助,所以提前致谢。

+1

使用'command = ...'不会改变'ans'。你不是在变量中存储'yes_command(...)'和'no_command(...)',也不是'Tkinter.Button'。它*被*调用,但没有存储它返回的内容。 – zondo

+0

由于调用函数的代码('mainloop()')忽略回调函数的返回值,所以不能从回调函数中返回某些东西。 –

回答

0

我有一个简单的解决方案为您的问题。我使用全局的StringVar()变量。您可以在任何功能中设置全局变量并稍后打印。

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

如果你描述了重要的变化,你的答案会更好。否则,读者必须将您的代码与原始的逐行比较。 –

+0

好吧你是对的我会解释 –

+0

三个'全球'陈述是不必要的。一个全局名称可以从一个函数内部到达,并且第三个'global'没有任何理由。 – gil

0

您可以创建一个类并从那里处理一个全局值。我还添加了一个名为Test ans value的新按钮,每次按YesNo按钮时,都会读取ans的值。我还评论了.destroy()行,以便您可以检查它的工作原理。

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

感谢大家的想法,我已经采取了简单的版本,然后通过调用它,将它添加到一个变量,然后输出该测试测试了它的价值重新受让人:

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) 

如果我第一次按Yes并且第二次没有,它会正确打印。在这个版本中,我删除了global的不必要用途。它完美的工作,感谢所有的帮助!