Python Tkinter变量未被重新评估

时间:2013-06-20 00:03:26

标签: python variables tkinter

我只是在学习Python的TKinter模块,并且有一个简单的文本框,要求速度和时间以及打印距离。出于某种原因,我的距离始终是无论速度如何初始化,都是我输入的时间。我想我需要第二个条目或全局化我的变量,但我想知道你是什么

from Tkinter import *

master = Tk()
speed = 10; time = 10; d = 50
e = Entry(master)
e.pack()
e. delete(0, END)
e.insert(0, "Enter Speed")

def callspeed():
        s = e.get()    
        speed = int(s)
        e.delete(0, END)
        e.insert(0, "Enter time")

def calltime():
        t = e.get()
        time = int(t)
        d = speed * time
        print d

bs = Button(master, text="Speed", width=15, command=callspeed)
bs.pack()
bt = Button(master, text="Time", width=15, command=calltime)
bt.pack()

mainloop()

2 个答案:

答案 0 :(得分:1)

问题是callspeed中的这一行:

speed = int(s)

创建一个名为speed的新本地变量,而不是更新全局变量。

要解决此问题,您只需要global声明:

def callspeed():
    global speed
    s = e.get()    
    speed = int(s)
    e.delete(0, END)
    e.insert(0, "Enter time")

确切的规则有点复杂(“自由变量” - 它基本上意味着你引用的变量,但从不分配给 - 可以来自闭包或来自全局;你指定的变量总是本地的),但是安全的东西要做的是在想要使用全局变量时始终添加global语句。


或者,更安全的是,首先不要使用全局变量。

例如,您可以将所有这些代码或其中的“模型”部分移动到一个类中,并使speed成为实例变量。

class ThingyModel(object):
    def __init__(self, e):
        self.speed, self.time, self.d = 10, 10, 50
        self.e = e

    def callspeed(self):
        s = self.e.get()
        self.speed = int(s)
        self.e.delete(0, END)
        self.e.insert(0, "Enter time")

    def calltime(self):
        t = self.e.get()
        self.time = int(t)
        self.d = self.speed * self.time
        print d

e = Entry(master)
e.pack()
e. delete(0, END)
e.insert(0, "Enter Speed")

model = ThingyModel(e)

bs = Button(master, text="Speed", width=15, command=model.callspeed)
bs.pack()
bt = Button(master, text="Time", width=15, command=model.calltime)
bt.pack()

(这不是一个真正的MVC设计,因为“控制器”部分遍布各处,而“视图”没有被组织成任何类型的结构,但它应该足以显示基本思想。 )

答案 1 :(得分:0)

abarnert是对的,全局变量是混乱的。这是我用速度和时间作为局部变量的重写:

from Tkinter import *

master = Tk()
Label(master,text="Speed:").grid(row=0,column=0)
Label(master,text="Time:").grid(row=1,column=0)
speed_entry = Entry(master)
speed_entry.grid(row=0,column=1)
time_entry = Entry(master)
time_entry.grid(row=1,column=1)

def submit():
    speed = float(speed_entry.get())
    time = float(time_entry.get())
    print "Speed is",speed
    print "Time is", time
    print "Distance is",speed*time

Button(master,text="Submit",command=submit).grid()

master.mainloop()