2016-07-19 6 views
0

Sehen Sie sich den folgenden Beispielcode an. Es gibt ein Hauptfenster, das die Funktion fun2 aufruft, um den Wert der Variablen a anzuzeigen (als Beschriftung mit Text). Gleichzeitig öffnet ein Menüeintrag im Hauptfenster ein zweites Fenster (Funktion fun1) mit zwei Tasten. Ich versuche, einen Weg zu finden, um den Wert von a durch diese Tasten zu ändern.Problem mit der Aktualisierung globaler/lokaler Variablen

Wenn ich die globale Variable a = 0 (Zeile 6) nicht einschließen, erhalte ich einen "globalen Namen 'a' ist nicht definiert" Fehler. Wenn ich es (wie in diesem Beispiel) einschließe, haben die Fensterschaltflächen keine Auswirkung auf die Variable (es bleibt a = 0). Ich habe versucht, den Befehl global a in fun1 ohne Wirkung zu verwenden. Ich habe auch experimentiert mit dem gleichen Befehl auch in fun2, aber ich kann immer noch nicht zur Arbeit.

Irgendwelche Ideen? Was mache ich falsch?

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() 

Antwort

1

Die global Anweisung muss in der Funktion verwendet werden, die auf die Variable zuweist. Es wird nicht in Unterfunktionen übertragen, weshalb es in fun1 keinen Effekt hatte. Sie müssen es zu var_yes und var_no hinzufügen.

+0

Saubere, präzise, ​​einfach zu implementierende Lösung. Perfekt! –

0

Was Sie falsch machen, ist zu denken, dass globale Variablen eine gute Idee sind. Dann nicht verstehen, wie man sie benutzt. In Python erstellen Sie eine globale By-Zuweisung im Modulebenebereich. Sie haben das getan, indem Sie einen Wert erstellen und ihn aufrufen a

In jeder Funktion, die "a" schreiben muss, müssen Sie als global deklarieren. Siehe Code

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()