[英]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.