首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致属性错误:'classObject‘对象没有属性'_w'?

是什么导致属性错误:'classObject‘对象没有属性'_w'?
EN

Stack Overflow用户
提问于 2011-04-10 10:50:19
回答 1查看 5.6K关注 0票数 1

我正在使用Python 3.1,我想创建一个游戏。我做了一个class Board(Canvas):为什么?因为我需要通过'tag‘来跟踪这些片段。但是,当我尝试将一个标记绑定到一个片段时,我得到了一个回溯,内容类似于...

代码语言:javascript
复制
Traceback (most recent call last):
File "/Users/bluedragon1223/Desktop/Djambi0-2.py", line 282, in <module>
x = Board()
File "/Users/bluedragon1223/Desktop/Djambi0-2.py", line 94, in __init__
self.tag_bind(self.canM, '<1>', _onPieceClick)
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/tkinter/__init__.py",
line 2103, in tag_bind
return self._bind((self._w, 'bind', tagOrId),
AttributeError: 'Board' object has no attribute '_w'

我可以按照代码一直到错误,我想我对这里的“_w”缺乏理解。

x = Board()之后,def __init__(self, window=mainWin):包含self.M = PhotoImage(file=path+'M.gif')。然后,self.M进入:

代码语言:javascript
复制
    def __draw(self):
    canvas = Canvas(mainWin,width=810,height=810)
    for i in range(9):
        canvas.create_line(90*i,0,90*i,810)
    for j in range(9):
        canvas.create_line(0,90*j,810,90*j)
    canvas.create_rectangle(3,810,810,3)
    canvas.bind('<1>', _point2square)
    canvas.pack()
    self.canM = canvas.create_image(405,405,image=self.M,tag = 'M')

之后,它被用在self.tag_bind(self.canM, '<1>', _onPieceClick)中。这就是错误发生的地方。我的问题是为什么?我做了什么,我如何修复它?

我感谢任何形式的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-11 19:20:24

诸如画布之类的tkinter对象仅仅是实际tk窗口小部件的代理对象。属性_w包含真实tk小部件的内部名称。例如:

代码语言:javascript
复制
$ python2.5
Python 2.5.4 (r254:67917, Dec 23 2008, 14:57:27) 
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter as tk
>>> root=tk.Tk()
>>> canvas = tk.Canvas(root)
>>>> print canvas._w
.8327736

如果你得到一个像object has no attribute '_w'这样的错误,这意味着你以某种方式创建了一个对象的实例,它认为它是一个tk窗口小部件(因此有像tag_bind这样的方法),但实际上并没有与之关联的tk窗口小部件。

可能发生这种情况的一种方式是,如果您子类化了一个tkinter小部件,但没有调用父类的__init__方法。例如,这样做会得到一个类似的错误(注意我没有在Canvas类上调用__init__ ):

代码语言:javascript
复制
>>> class Board(tk.Canvas):
...     def __init__(self, *args):
...         pass         
...     
>>> board = Board()
>>> board.tag_bind("whatever","<1>", None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk
/Tkinter.py", line 2129, in tag_bind
return self._bind((self._w, 'bind', tagOrId),
AttributeError: Board instance has no attribute '_w'

我的猜测是您正在做这样的事情。您正在将Board定义为Canvas的子类,但是您没有调用Canvas.__init__方法(或者调用它并忽略它抛出的任何错误)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5609448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档