Почему у меня возникает этот TypeError при использовании tkinter?
-
05-07-2019 - |
Вопрос
итак, я обновился до 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])
в старой версии все было в порядке.Я не уверен, что изменилось так, что способ, которым я получаю каждую координату, невозможен.
".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 пока?