2016-03-21 103 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的不必要用途。它完美的工作,感謝所有的幫助!