我正在使用Python 3.1,我想创建一个游戏。我做了class Board(Canvas):
为什么?因为我需要通过'标签'跟踪这些碎片。但是,当我尝试将标签绑定到一个片段时,我会得到一个类似......的回溯。
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
然后进入:
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)
中使用。这就是错误发生的地方。我的问题是为什么?我做了什么,我该如何解决?
我感谢任何帮助!
答案 0 :(得分:1)
诸如画布之类的tkinter对象只是实际tk小部件的代理对象。属性_w
包含真实tk小部件的内部名称。例如:
$ 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__
方法。例如,你得到一个类似的错误(注意我不在__init__
类上调用Canvas
):
>>> 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__
方法(或调用它并忽略它抛出的任何错误)