2013-07-08 105 views
1

我正在Python 2.7中編寫一個Tkinter應用程序,但我遇到了一些我以前沒有遇到的麻煩。從我所知道的情況來看,Tkinter模塊看起來像是在我的課程中爲__init__函數導入的,但不適用於其他函數。下面是我的本錢簡化版本:Tkinter導入時出錯

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.,但寧願避免它(我不應該這樣做無論如何!)

我一定錯過了一些關於導入方式的大作,但是我可以發誓,這種相同類型的代碼已經爲我工作過。有人能幫我解決這個問題嗎?

回答

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?

編輯

更改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() 
+0

我相當積極,我沒有在我的代碼中的任何'框架'的其他定義。有什麼可能導致導入無法在班級的所有模塊中被識別? – user1636547

+0

@ user1636547,你能展示完整的'BuildFrames'代碼嗎? – falsetru

+0

找到了錯誤......事實證明,我在後面的'BuildFrames'中的迭代器中使用了一個變量'Frame'。我將發佈代碼作爲答案。 – user1636547

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() 

如果它仍然是不明確的,包括如下(函數的其餘部分)的代碼的一個簡單的例子,我們會指出來爲你

0

問題的根源在於你正在進行全球導入。因此,框架小部件被導入爲Frame

當你做for Frame in frames,你是覆蓋框架類命名爲Frame,因爲你不能有兩件事情具有相同名稱的局部變量。

由於python的設計方式,它認識到你正在創建一個名爲「Frame」的本地變量,然後該函數中的任何代碼都會運行。所以,當你做到這一點代碼:

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

...的Frame類不再存在,因爲它已取代局部變量。由於您尚未爲本地變量「Frame」分配值,因此會出現您所做的錯誤。

修復非常簡單:不要創建名爲「Frame」的局部變量,和/或不要執行全局導入。