Python Tkinter AttributeError:'NoneType'对象没有属性'remove'

时间:2014-05-12 00:49:30

标签: python tkinter attributeerror

使用tkinter画布对象时遇到问题。问题在于以下功能,更确切地说是self.canvas.destroy()。当我注释掉try - 语句时,该函数可以完美地工作大约10000个周期,然后tkinter完全停止工作,我怀疑这与未删除画布对象时的内存错误有关。

def updateFrame(self):
    self.canvas.pack_forget()
    try:
        self.canvas.destroy()
    except:
        pass
    self.canvas = Canvas(self.root, width = 640, height = 640, bg = 'black')    
    for player in self.players:
        player.drawMaster()
    self.canvas.pack()
    self.canvas.after(10, self.updateFrame)

但是,self.canvas.destroy()处于活动状态时出现的错误消息是在两个周期之后发生的。

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
    return self.func(*args)
  File "C:\Python33\lib\tkinter\__init__.py", line 504, in callit
    self.deletecommand(name)
  File "C:\Python33\lib\tkinter\__init__.py", line 363, in deletecommand
    self._tclCommands.remove(name)
AttributeError: 'NoneType' object has no attribute 'remove'

我似乎无法找到答案。并且为了避免我已经考虑过的解决方案:self.canvas在第一次运行函数之前声明,然后仅在上面的函数中进行修改,因此self.canvas始终是画布对象。

我也使用线程,但不知道这会如何影响画布对象。

编辑: 我想在每个帧之间删除和创建画布对象的原因是因为我希望程序读取底层对象的状态并将其简单地显示在屏幕上,删除画布对象比删除每个对象要容易得多在屏幕上重绘它们。

0 个答案:

没有答案