Python Tkinter变量没有被重新计算

2024-09-30 10:39:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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()

Tags: master距离gettimedef时间deletepack
2条回答

阿巴纳特是对的,全局变量很混乱。以下是我用速度和时间作为局部变量的重写:

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

问题是callspeed中的这一行:

speed = int(s)

创建名为speed的新局部变量,而不是更新全局变量。在

要修复它,只需要一个^{}声明:

^{pr2}$

确切的规则有点复杂(“自由变量”(free variables)——这基本上意味着您引用但从未赋值的变量既可以来自闭包,也可以来自全局;指定给的变量总是局部的),但安全的做法是,当您想使用全局变量时,总是添加一个global语句。在


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

例如,您可以将所有这些代码,或者只是其中的“model”部分移到一个类中,并使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设计,因为“控制器”部分分散在各处,“视图”没有组织成任何类型的结构,但它应该足以显示基本思想。)

相关问题 更多 >

    热门问题