Tkinter导入时出错

时间:2013-07-08 06:22:17

标签: python import tkinter

我正在用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.,但宁愿避免它(我也不应该这样做!)

我必须遗漏一些关于导入方式的重要信息,但我可以发誓这种类型的代码以前对我有用。有人可以帮我解决这个问题吗?

3 个答案:

答案 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”的局部变量,和/或不进行全局导入。