【问题标题】:PYTHON: __init__ method does not create attributes?PYTHON:__init__ 方法不创建属性?
【发布时间】:2013-12-23 19:57:15
【问题描述】:

我正在使用 Tkinter,我正在尝试为属于 Main1 类的主要对象创建一个名为 wordlist 的属性。

这是 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

【问题讨论】:

  • 你从哪里得到这个错误?
  • 什么时候调用"pointhndlr"?相反,什么时候调用 create_wdgts?
  • 展示你如何创建对象。很可能您的__init__ 没有运行。为什么要将 wordlist 参数传递给您忽略的 __init__
  • 我的猜测是调用基本构造函数会调用 create_wdgts,它会调用 self.pointhndlr。请注意,当您分配self.pointbttn["command"] = self.pointhndlr() 时,您不会在单击该按钮时调用该方法,而是实际上调用该方法作为该分配的一部分,分配它返回的任何内容(这对命令来说似乎没什么,又名None)。
  • 与其粘贴一大堆几乎不相关的代码并遗漏大量其他代码,不如将您的代码精简为一个最小的、完整的示例来演示问题。如需更多指导,请参阅SSCCE

标签: python class init


【解决方案1】:

这里的原因是这样的:

super(Main1,self).__init__(master)

依次调用:

def create_wdgts(self):

这反过来会这样做:

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

函数self.pointhndlr分配给self.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 实例。

    【讨论】:

    • super 的调用是完全正确的(假设Instruction.__init__() 当然将master 作为参数)。请检查你的事实。
    • 如果你幸运的话,当你尝试构造一个Main1 时,这个“修复”只会引发一个TypeError,因为你传递了一个太多的参数。否则,它将构造一个其父窗口本身就是其父窗口的Main1,这将导致灾难性和痛苦的调试问题。
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 2022-11-22
    • 1970-01-01
    • 2016-11-10
    • 2011-04-05
    • 2017-12-14
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多