我正在用Python 2.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()
当我运行它时,我收到以下错误:
Traceback (most recent call last):
File "myApp.py", line 131, in <module>
App()
File "myApp.py", line 12, in __init__
self.BuildFrames()
File "myApp.py", line 26, in BuildFrames
frame1 = Frame(self.window,borderwidth=2,padx=10,pady=10)
UnboundLocalError: local variable 'Frame' referenced before assignment
据我所知,Frame
函数未被BuildFrames()
函数识别为Tkinter方法。如何在__init__
中识别,而不是在BuildFrames
???
我可以通过将导入更改为:
来解决问题import Tkinter as Tk
然后在所有Tkinter方法的前面添加Tk.
,但宁愿避免它(我也不应该这样做!)
我必须遗漏一些关于导入方式的重要信息,但我可以发誓这种类型的代码以前对我有用。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
也许代码中的某处,Frame = ...
存在。将该变量重命名为Frame
以外的其他变量。
您正在执行以下代码:
>>> def f():
... a + 1
... a = 0
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
Why am I getting an UnboundLocalError when the variable has a value?
修改强>
按以下方式更改BuildFrame:
def BuildFrames(self):
frames = []
frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
# more code follows...
for frame in frames:
frame.grid()
答案 1 :(得分:0)
您要在该功能的某个地方分配Frame
frame1 = Frame(self.window,borderwidth=2,padx=10,pady=10)
UnboundLocalError: local variable 'Frame' referenced before assignment
由于你要分配它,Python知道它必须是一个局部变量,所以不要看全局变量。
以下是此问题的一个简单示例
a = 1
def f():
b = a + 1
a = b + 1 # If this wasn't here, the above line would use the global `a`
f()
如果仍然不清楚,请包含后面的代码(函数的其余部分),我们会为您指出
答案 2 :(得分:0)
问题的根源在于您正在进行全局导入。因此,框架窗口小部件将导入为Frame
。
执行for Frame in frames
时,您使用名为Frame
的局部变量覆盖 Frame类,因为您不能拥有两个具有相同名称的内容。
由于python的设计方式,它识别出你在该函数中的任何代码运行之前创建一个名为“Frame”的局部变量。所以,当你这样做时:
frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
... Frame
类不再存在,因为它已被局部变量替换。由于您还没有为局部变量“Frame”分配值,因此您会收到错误。
修复非常简单:不要创建名为“Frame”的局部变量,和/或不进行全局导入。