Что является причиной ошибки атрибута: объект «classObject» не имеет атрибута «_w»? - PullRequest
0 голосов
/ 10 апреля 2011

Я работаю с 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).И вот где возникает ошибка.Мой вопрос почему?Что я сделал и как мне это исправить?

Я ценю любую помощь!

1 Ответ

1 голос
/ 11 апреля 2011

Объект tkinter, такой как canvas, является просто прокси-объектом для реального виджета 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__ (или вызываете его и игнорируете все ошибки, которые он выдает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...