我正在用Python2.7编写Tkinter应用程序,但遇到了一些以前从未遇到过的麻烦。据我所知,Tkinter模块似乎是为类中的__init__
函数导入的,而不是为其他函数导入的。以下是我得到的简化版本:
from Tkinter import *
class App:
def __init__(self):
self.master = Tk()
self.window = Frame(self.master)
self.window.grid()
self.BuildFrames()
self.master.mainloop()
def BuildFrames(self):
frames = []
frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
# more code follows...
for Frame in frames:
Frame.grid()
App()
运行此程序时,我收到以下错误:
^{pr2}$据我所知,Frame
函数没有被识别为BuildFrames()
函数中的Tkinter方法。究竟怎样才能在__init__
中而不是在BuildFrames
内被识别???在
我可以通过将导入更改为:
import Tkinter as Tk
然后在所有的Tkinter方法前面添加一个Tk.
,但宁愿避免它(而且我也不应该这样做!)在
我一定是错过了一些关于导入工作方式的重要信息,但我可以发誓,这种类型的代码以前对我也有用。有人能帮我解决这个问题吗?在
问题的根源是你正在进行全局导入。因此,框架小部件作为
Frame
导入。在当你做
for Frame in frames
时,你是在用一个名为Frame
的局部变量覆盖Frame类,因为你不能有两个同名的东西。在由于python的设计方式,它可以识别出在该函数中的任何代码运行之前正在创建一个名为“Frame”的局部变量。所以,当你这么做的时候:
。。。
Frame
类不再存在,因为它已被局部变量替换。因为你还没有给局部变量“Frame”赋值,你得到了你所做的错误。在解决方法很简单:不要创建名为“Frame”的局部变量,和/或不进行全局导入。在
可能在代码的某个地方,
Frame = ...
存在。将该变量重命名为Frame
以外的变量。在您正在执行以下代码:
Why am I getting an UnboundLocalError when the variable has a value?
编辑
按如下方式更改构建框架:
^{pr2}$您正在将
Frame
赋值给该函数中的某个地方因为您要给它赋值,Python知道它必须是一个局部变量,所以没有考虑全局变量。在
下面是这个问题的一个简单例子
^{pr2}$如果还不清楚,请包括后面的代码(函数的其余部分),我们将为您指出
相关问题 更多 >
编程相关推荐