簡體   English   中英

Tkinter導入錯誤

[英]Error on Tkinter import

我正在用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

據我所知,在BuildFrames()函數中, Frame函數未被識別為Tkinter方法。 到底如何在__init__識別它,但在BuildFrames卻不能識別出???

我可以通過將導入更改為來解決此問題:

import Tkinter as Tk

然后添加一個Tk. 在所有Tkinter方法之前,但寧願避免使用它(我也不必這樣做!)

我一定對導入的工作方式有所遺漏,但是我可以發誓以前使用過這種類型的代碼。 有人可以幫我這個忙嗎?

也許在您的代碼中某處存在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()

您正在將該功能分配給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()

如果仍然不清楚,請包含以下代碼(該函數的其余部分),我們將為您指出

問題的根源在於您正在執行全局導入。 因此,框架小部件將作為Frame導入。

當您for Frame in frames ,您將使用名為Frame的局部變量覆蓋 Frame類,因為您不能同時擁有兩個名稱相同的東西。

由於python的設計方式,它認識到您正在運行該函數中的任何代碼之前創建一個名為“ Frame”的局部變量。 因此,當您執行以下代碼時:

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

... Frame類不再存在,因為它已被局部變量替換。 並且由於尚未為局部變量“ Frame”分配值,因此會出現錯誤。

修復非常簡單:不要創建名為“ Frame”的局部變量,和/或不進行全局導入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM