Почему у меня возникает этот TypeError при использовании tkinter?

StackOverflow https://stackoverflow.com/questions/1406371

Вопрос

итак, я обновился до 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, у меня есть idle 3.1.1 и python 3.1.1.я знаю, что предоставленная мной ссылка на PDF предназначена для версии 8.4, но я не могу представить, что в этих функциях произошли изменения.

Спасибо!

Это было полезно?

Решение

self.canvas.coords(name)

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

вам нужно изменить свой код, чтобы он был:

temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))

Другие советы

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

Вы прогнали свой скрипт через 2то3 пока?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top