2015-09-23 272 views
-1

我在python 2.7中得到以下錯誤,在方法updateText下,當我嘗試調用self.editArea.insert()時。Tkinter對象沒有屬性

AttributeError: 'App2' object has no attribute 'editArea' 

我的代碼是:

import Tkinter as tk 
import threading 

class App2(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.start() 

    def callback(self): 
     self.root.quit() 

    def run(self): 
     self.root = tk.Tk() 
     self.root.protocol("WM_DELETE_WINDOW", self.callback) 
     self.root.geometry("200x100") 
     self.COMframe = tk.Frame(self.root, width=200, height=100, bg = '#ffffff', borderwidth=1, relief="sunken") 
     self.scrollbar = tk.Scrollbar(self.COMframe) 
     self.editArea = tk.Text(self.COMframe, width=200, height=100, yscrollcommand=self.scrollbar.set, borderwidth=0, highlightthickness=0) 
     self.scrollbar.config(command=self.editArea.yview) 
     self.scrollbar.pack(side="right", fill="y") 
     self.editArea.pack(side="left", fill="both", expand=True) 
     self.COMframe.grid(row=1, column=1) 

     #self.editArea.config(state=tk.NORMAL) 
     #self.editArea.delete(1.0, tk.END) 
     self.editArea.insert(tk.END, "hello world\n this is my text") 
     #self.editArea.config(state=tk.DISABLED) 

     self.root.mainloop() 

    def updateText(self, string): 
     #self.editArea.config(state=tk.NORMAL) 
     #self.editArea.delete(1.0, tk.END) 
     self.editArea.insert(tk.END, string) 
     #self.editArea.config(state=tk.DISABLED) 

app2 = App2() 

r = 0 
while True: 
    s = "r={}".format(r) 
    app2.updateText(s) 

    r = r+1 
    print s 

我不明白爲什麼Python將不會看到editArea。它是否與run(self)中聲明的事實有關?

+0

對'self.editArea'的賦值就像任何其他賦值一樣;它會在'run'被調用時發生,未定義。如果需要在其他方法中使用它,則需要將其移至'__init__'或保證'run'將在'updateText'之前被調用。 – chepner

+0

我假設'run'方法被調用,因爲當我取出'updateText'方法時tkinter GUI彈出。 – knap720

+0

您的代碼中存在爭用條件。在主線程中調用'updateText'時,'run'方法可能沒有到達創建'self.editArea'的行。我建議將TK組件的創建移動到'__init__'函數中。 –

回答

0

您在run方法中定義了self.editText,但您永遠不會調用run方法(或者您通過某些代碼調用它,但不會顯示給我們)。

底線:在嘗試使用它之前,您必須先定義一個實例變量,但是您的代碼在run之前調用updateText的順序運行,這可以通過幾個打印語句證明。