<p>问题是<code>callspeed</code>中的这一行:</p>
<pre><code>speed = int(s)
</code></pre>
<p>创建名为<code>speed</code>的新<em>局部</em>变量,而不是更新全局变量。在</p>
<p>要修复它,只需要一个<a href="http://docs.python.org/2.7/reference/simple_stmts.html#the-global-statement" rel="nofollow">^{<cd3>}</a>声明:</p>
^{pr2}$
<p>确切的规则有点复杂(“自由变量”(free variables)——这基本上意味着您引用但从未赋值的变量既可以来自闭包,也可以来自全局;指定给的变量总是局部的),但安全的做法是,当您想使用全局变量时,总是添加一个<code>global</code>语句。在</p>
<hr/>
<p>或者,更安全的是,首先不要使用全局变量。在</p>
<p>例如,您可以将所有这些代码,或者只是其中的“model”部分移到一个类中,并使<code>speed</code>成为一个实例变量。在</p>
<pre><code>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()
</code></pre>
<p>(这不是一个真正的MVC设计,因为“控制器”部分分散在各处,“视图”没有组织成任何类型的结构,但它应该足以显示基本思想。)</p>