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!

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top