1

我正在用 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函数没有被识别为函数中的 Tkinter 方法BuildFrames()。它到底怎么能在里面被识别出来__init__而不是在里面呢BuildFrames???

我可以通过将导入更改为:

import Tkinter as Tk

然后Tk.在所有 Tkinter 方法前面添加一个,但宁愿避免它(而且我不应该这样做!)

我一定错过了关于导入工作方式的一些重要内容,但我可以发誓这种相同类型的代码以前对我有用。有人可以帮我解决这个问题吗?

4

3 回答 3

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

当变量有值时,为什么我会收到 UnboundLocalError?

编辑

更改您的 BuildFrames 如下:

def BuildFrames(self):
    frames = []
    frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
    # more code follows...

    for frame in frames:
        frame.grid()
于 2013-07-08T06:24:40.340 回答
0

问题的根源在于您正在进行全局导入。因此,框架小部件被导入为Frame.

当你这样做时for Frame in frames,你正在用一个名为的局部变量覆盖FrameFrame 类,因为你不能有两个同名的东西。

由于 python 的设计方式,它会在该函数中的任何代码运行之前识别出您正在创建一个名为“Frame”的局部变量。因此,当您执行此代码时:

frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))

...Frame该类不再存在,因为它已被局部变量替换。而且由于您尚未为局部变量“Frame”分配值,因此您会得到您所做的错误。

修复非常简单:不要创建名为“Frame”的局部变量,和/或不要进行全局导入。

于 2013-07-08T11:09:17.027 回答
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()

如果还不清楚,请包含后面的代码(函数的其余部分),我们会为您指出

于 2013-07-08T06:25:48.130 回答