-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)
中聲明的事實有關?
對'self.editArea'的賦值就像任何其他賦值一樣;它會在'run'被調用時發生,未定義。如果需要在其他方法中使用它,則需要將其移至'__init__'或保證'run'將在'updateText'之前被調用。 – chepner
我假設'run'方法被調用,因爲當我取出'updateText'方法時tkinter GUI彈出。 – knap720
您的代碼中存在爭用條件。在主線程中調用'updateText'時,'run'方法可能沒有到達創建'self.editArea'的行。我建議將TK組件的創建移動到'__init__'函數中。 –