2013-12-23 91 views
1

我正在與Tkinter合作,我正在嘗試爲屬於Main1類的主對象創建一個名爲wordlist的屬性。PYTHON:__init__方法不會創建屬性?

這是MAIN1類:

class Main1(Instructions): 
    def __init__(self, master, wordlist): 
     super(Main1,self).__init__(master) 
     self.wordlist = self.readwords() 
     self.textbox.insert(0.0,self.wordlist) 
    def create_wdgts(self): 

     mainlbl = Label(self,text="Tänk på ett ord!") 
     mainlbl.grid(row=0,column=2) 

     self.textbox = Text(self, width = 50, height = 5, wrap = WORD) 
     self.textbox.grid(column=2,row=1) 

     self.backbttn = Button(self,text="Tillbaka") 
     self.backbttn["command"] = self.back 
     self.backbttn.grid(column=5,row=0) 

     self.pointentry = Entry(self) 
     self.pointentry.grid(column=2, row=2) 
     self.pointlbl = Label(self,text = "Poäng:") 
     self.pointlbl.grid(column = 1, row= 2) 
     self.pointbttn = Button(self, text="skicka poäng") 
     self.pointbttn.grid(row= 2, column = 3) 
     self.pointbttn["command"]= self.pointhndlr() 

     self.crrctlbl = Label(self, text = "Rätt ord:") 
     self.crrctlbl.grid(column = 1, row = 3) 
     self.crrctentry = Entry(self) 
     self.crrctentry.grid(column = 2, row= 3) 
     self.crrctbttn = Button(self, text="skicka rätt ord") 
     self.crrctbttn.grid(row= 3, column = 3) 

     self.yesbttn = Button(self, text="Ja") 
     self.yesbttn.grid(row = 4, column=4) 

     self.nobttn = Button(self, text = "Nej") 
     self.nobttn.grid(row=4, column=5) 

    def readwords(self): 
     """Returns list with all words in words.txt""" 
     file = codecs.open("words.txt","r","utf8") 
     wordlist = [] 
     for word in file: 
      wordlist.append(word.strip()) 
     return wordlist 

    def guess(self): 
     self.guesstemp = random.choice(wordlist) 
     self.textbox.insert(0.0,"Ange poäng för ordet '"+guesstemp+"': ") 

    def pointhndlr(self): 
     pointtemp = self.pointentry.get() 
     self.pointentry.delete(0) 
     self.wordlist = remvwords(self.wordlist,self.guesstemp,self.pointtemp,self.guesslist,self.pointlist) 

我希望我並不需要發佈更多的程序,因爲這已經是一個很大的代碼。無論如何,我收到一條錯誤消息,說我的Main1對象沒有wordlist屬性。爲什麼?我在init方法中創建它!

感謝您的幫助。

薩罕德

編輯:錯誤追溯到最後一行,在那裏我試圖改變self.wordlist的價值。 的錯誤信息是:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1475, in __call__ 
    return self.func(*args) 
    File "/Users/SahandZarrinkoub/Documents/graphics.py", line 294, in main1 
    main1.guess() 
    File "/Users/SahandZarrinkoub/Documents/graphics.py", line 364, in guess 
    self.textbox.insert(0.0,"Ange poäng för ordet '"+guesstemp+"': ") 
NameError: global name 'guesstemp' is not defined 
+0

你從哪裏得到那個錯誤? –

+0

在最後一行。 – Sahand

+0

何時調用「pointhndlr」?相反,何時調用create_wdgts? –

回答

2

這裏的原因是這樣的:

super(Main1,self).__init__(master) 

會依次調用此:

def create_wdgts(self): 

這將反過來做:

self.pointbttn["command"]= self.pointhndlr() 

This是否不是指定函數self.pointhndlrself.pointbttn["command"],而是調用self.pointhndlr,並將結果指定給self.pointbttn["command"]

解決方案:去掉括號:

self.pointbttn["command"]= self.pointhndlr 
-2

調用super.init是錯誤的方式。

您使用:

super(Main1,self).__init__(master) 

你應該使用:

super(Main1,self).__init__(self, master) 

你稱它的樣子,你正在創建對象不是初始化爲Instructions實例。相反,master對象會被重新初始化或重新建立爲Instructions實例。

+0

對'super'的調用是完全正確的(假設'Instruction .__ init __()'當然需要'master'作爲參數)。請檢查你的事實。 –

+0

如果你幸運的話,當你嘗試構造一個'Main1'時,這個「修復」會引發一個'TypeError',因爲你傳遞了太多的參數。否則,它會構造一個Main1,它的父窗口本身會導致災難性和痛苦的調試問題。 – abarnert