我只是在学习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()
答案 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()