2016-03-21 11 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

3つの 'global'ステートメントは不要です。関数の内部からグローバルな名前に到達することができ、第3の「グローバル」の理由は確かにありません。 – gil

0

クラスを作成し、そこからグローバル値を扱うことができます。私はTest ans valueという名前の新しいボタンを追加して、またはNoボタンを押すたびに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) 

最初に「はい」を、もう一度「いいえ」を押すと、正しく印刷されます。このバージョンでは、私はというグローバルな不要な用途を削除しました。です。すべての助けを借りて、完璧に動作します!

関連する問題