Почему у меня эта TypeError при использовании tkinter? - PullRequest
0 голосов
/ 10 сентября 2009

, поэтому я обновился до python 3.1.1 с 2.6 и запустил старую программу, в которой используется tkinter.

Я получаю следующее сообщение об ошибке, которое я не помню, получая в версии 2.6.

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\myprog.py", line 77, in <lambda>
    self.canvas.bind("<Button-3>", lambda event: myfunc_sub(event))
  File "C:\myprog.py", line 65, in myfunc_sub
    temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])
TypeError: 'map' object is not subscriptable

Я уверен, что линия

temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])

было хорошо в старой версии. Я не уверен, что изменилось, поэтому способ получения каждой координаты невозможен.

из документов tkinter (pdf)

". Find_enclosed (x1, y1, x2, y2) Возвращает список идентификаторов объектов всех объектов, которые находятся полностью внутри прямоугольника, левый верхний угол которого (x1, y1) и правый нижний угол которого (x2, y2).

.find_overlapping (x1, y1, x2, y2) Как и предыдущий метод, но возвращает список идентификаторов объектов всех объектов, которые имеют хотя бы одну точку с данным прямоугольником. "

есть идеи как это исправить? пожалуйста, дайте мне знать, если вам нужно больше информации. у меня есть версия tkinter 8.5, у меня простоя 3.1.1 и python 3.1.1. я знаю, что предоставленная мною ссылка на pdf предназначена для 8.4, но я не могу представить, что в этих функциях произошло изменение.

спасибо!

Ответы [ 2 ]

3 голосов
/ 10 сентября 2009

Было несколько серьезных изменений с Python 2.X на Python 3.X - среди них функциональность map.

Вы уже запустили свой скрипт через 2to3 ?

2 голосов
/ 10 сентября 2009
self.canvas.coords(name)

возвращает map object, и, поскольку в состоянии ошибки map объект непригоден для Python 3. вам нужно изменить coords на кортеж или список.

вам нужно изменить код на:

temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...