Tkinter imp出错

2024-10-03 11:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 方法函数importselfmasterappframesinit
3条回答

问题的根源是你正在进行全局导入。因此,框架小部件作为Frame导入。在

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

由于python的设计方式,它可以识别出在该函数中的任何代码运行之前正在创建一个名为“Frame”的局部变量。所以,当你这么做的时候:

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

。。。Frame类不再存在,因为它已被局部变量替换。因为你还没有给局部变量“Frame”赋值,你得到了你所做的错误。在

解决方法很简单:不要创建名为“Frame”的局部变量,和/或不进行全局导入。在

可能在代码的某个地方,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?

编辑

按如下方式更改构建框架:

^{pr2}$

您正在将Frame赋值给该函数中的某个地方

    frame1 = Frame(self.window,borderwidth=2,padx=10,pady=10)
UnboundLocalError: local variable 'Frame' referenced before assignment

因为您要给它赋值,Python知道它必须是一个局部变量,所以没有考虑全局变量。在

下面是这个问题的一个简单例子

^{pr2}$

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

相关问题 更多 >