Question

donc je suis passé de la version 2.6 à python 3.1.1 et j’exécutais un ancien programme qui utilisait tkinter.

Je reçois le message d'erreur suivant dont je ne me souviens pas d'avoir été dans la version 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

Je suis à peu près sûr que la ligne

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])

était ok dans l'ancienne version. Je ne suis pas sûr de ce qui a changé, de sorte que la manière d'obtenir chaque coordonnée n'est pas possible.

à partir du document tkinter (pdf)

  

".find_enclosed (x1, y1, x2, y2)   Renvoie une liste des ID d’objets de tous les objets se trouvant complètement dans le rectangle dont le coin supérieur gauche est (x1, y1) et le coin inférieur droit est (x2, y2).

     

.find_overlapping (x1, y1, x2, y2)   Comme la méthode précédente, mais renvoie une liste des ID d’objets de tous les objets partageant au moins un point avec le rectangle donné. "

des idées sur la façon de résoudre ce problème? s'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations. la version de tkinter que j'ai est 8.5, j'ai inactif 3.1.1 et python 3.1.1. Je sais que le lien pdf que j'ai fourni correspond à la version 8.4, mais je ne peux pas imaginer que ces fonctions ont été modifiées.

merci!

Était-ce utile?

La solution

self.canvas.coords(name)

renvoie un objet map et, comme le message d'erreur indique que l'objet map n'est pas souscrit en python 3. vous devez modifier coords pour être un tuple ou une liste.

vous devez modifier votre code pour qu'il soit:

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

Autres conseils

Il y a eu plusieurs changements radicaux entre Python 2.X et Python 3.X - parmi eux, les fonctionnalités de map .

Avez-vous déjà exécuté votre script via 2to3 ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top