2016-07-19 15 views
0

以下のサンプルコードをご覧ください。メインウィンドウがあり、関数fun2を呼び出して変数a(ラベル付き/テキスト)の値を表示します。同時に、メインウィンドウのメニュー項目は、2つのボタンを持つ2次ウィンドウ(機能fun1)を起動します。これらのボタンを使ってaの値を変更する方法を見つけようとしています。グローバル/ローカル変数の更新に関する問題

グローバル変数a = 0(行6)が含まれていないと、グローバル名「aが定義されていません」というエラーが表示されます。これを含めると(この例のように)、ウィンドウボタンは変数に影響を与えません(a = 0のままです)。私はfun1global aというコマンドを使ってみましたが、何の効果もありません。私もfun2でも同じコマンドを使って実験しましたが、まだ動作させることができません。

アイデア?私は間違って何をしていますか?

import Tkinter 
import random 
import time 
from Tkinter import * 

a = 0 

def fun1(): 
    win2 = Toplevel() 
    win2.geometry("300x300") 
    def var_yes(): 
     a = 1 
     win2.after(500, lambda: win2.destroy()) 
    def var_no(): 
     a = 0 
     win2.after(500, lambda: win2.destroy()) 
    button1 = Tkinter.Button(win2, text ="1", command = var_yes).pack() 
    button2 = Tkinter.Button(win2, text ="2", command = var_no).pack() 

def fun2(): 
    value = 0 
    if a == 1: 
     value = a 
    granresult = "{}".format(value) 
    lbl.configure(text = str(granresult)) 


def gui_stuff(window): 
    global lbl 
    window.configure(background="#000000") 
    window.geometry("700x500") 
    lbl = Tkinter.Label(window, height=5, anchor = "c", text="Label", bg="#000000", fg="#ffffff", font=("Helvetica", 22)) 
    lbl.pack() 
    fun2() 


window = Tkinter.Tk() 
menubar = Menu(window) 
filemenu = Menu(menubar, tearoff=0) 
menubar.add_cascade(label="Program", menu=filemenu) 
filemenu.add_command(label="test", command=fun1) 
window.config(menu=menubar) 
gui_stuff(window) 
window.update() 
winx1 = window.winfo_rootx() 
winy1 = window.winfo_rooty() 
winh1 = window.winfo_height() 
window.mainloop() 

答えて

1

global文は、変数に割り当てる機能でを使用する必要があります。それは副機能に継承されないので、fun1には影響しませんでした。 var_yesvar_noの両方に追加する必要があります。

+0

清潔で正確で実装しやすいソリューションです。完璧! –

0

あなたが間違っていることは、グローバル変数が良い考えであると考えていることです。その後、それらを使用する方法を理解していない。 Pythonでは、モジュールレベルのスコープに代入によってグローバルを作成します。値を作成して呼び出すと、値はaになります。

`a 'と書かなければならない関数では、グローバルとして宣言する必要があります。コードを参照

import Tkinter 
import random 
import time 
from Tkinter import * 

a = 0 

def fun1(): 
    win2 = Toplevel() 
    win2.geometry("300x300") 
    def var_yes(): 
     global a 
     a = 1 
     win2.after(500, lambda: win2.destroy()) 
    def var_no() 
     global a 
     a = 0 
     win2.after(500, lambda: win2.destroy()) 
    button1 = Tkinter.Button(win2, text ="1", command = var_yes).pack() 
    button2 = Tkinter.Button(win2, text ="2", command = var_no).pack() 

def fun2(): 
    global a 
    value = 0 
    if a == 1: 
     value = a 
    granresult = "{}".format(value) 
    lbl.configure(text = str(granresult)) 


def gui_stuff(window): 
    # the next line refers to a global which doesn't exist 
    global lbl 
    window.configure(background="#000000") 
    window.geometry("700x500") 
    lbl = Tkinter.Label(window, height=5, anchor = "c", text="Label", bg="#000000", fg="#ffffff", font=("Helvetica", 22)) 
    lbl.pack() 
    fun2() 


window = Tkinter.Tk() 
menubar = Menu(window) 
filemenu = Menu(menubar, tearoff=0) 
menubar.add_cascade(label="Program", menu=filemenu) 
filemenu.add_command(label="test", command=fun1) 
window.config(menu=menubar) 
gui_stuff(window) 
window.update() 
winx1 = window.winfo_rootx() 
winy1 = window.winfo_rooty() 
winh1 = window.winfo_height() 
window.mainloop() 
関連する問題