¿Por qué tengo este TypeError cuando uso tkinter?
-
05-07-2019 - |
Pregunta
así que me actualicé a Python 3.1.1 desde 2.6 y ejecuté un antiguo programa mío que usa tkinter.
Recibo el siguiente mensaje de error que no recuerdo haber recibido en la versión 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
Estoy bastante seguro de la línea
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])
estaba bien en la versión anterior. No estoy seguro de qué ha cambiado, por lo que la forma en que obtengo cada coordenada no es posible.
de la tkinter docs (pdf)
" .find_enclosed (x1, y1, x2, y2) Devuelve una lista de los ID de objeto de todos los objetos que aparecen completamente dentro del rectángulo cuya esquina superior izquierda es (x1, y1) y la esquina inferior derecha es (x2, y2).
.find_overlapping (x1, y1, x2, y2) Igual que el método anterior, pero devuelve una lista de los ID de objeto de todos los objetos que comparten al menos un punto con el rectángulo dado. & Quot;
¿Alguna idea sobre cómo solucionar esto? por favor déjeme saber si usted necesita mas información. la versión tkinter que tengo es 8.5, tengo inactivo 3.1.1 y python 3.1.1. Sé que el enlace pdf que proporcioné es para 8.4, pero no puedo imaginar que haya un cambio en estas funciones.
gracias!
Solución
self.canvas.coords(name)
devuelva un objeto de mapa
, y como el error indica que mapa
no se puede suscribir en Python 3. necesita cambiar coords
para ser un Tupla o una lista.
necesitas cambiar tu código para ser:
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
Otros consejos
Hubo varios cambios de ruptura de Python 2.X a Python 3.X, entre ellos, la funcionalidad de map
.
¿Ya has ejecutado tu script a través de 2to3 todavía?