Warum habe ich diese Typeerror wenn tkinter mit?
-
05-07-2019 - |
Frage
so ich Python Upgrade 3.1.1 von 2.6 und ich lief ein altes Programm von mir, die tkinter verwendet.
Ich erhalte die folgende Fehlermeldung, die ich mich nicht erinnern, in der 2.6-Version zu bekommen.
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
Ich bin mir ziemlich sicher, dass die Zeile
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])
war in der älteren Version ok. Ich bin mir nicht sicher, was sich geändert hat, so dass die Art, wie ich jede Koordinate erhalten nicht möglich ist.
von der tkinter docs (pdf)
“. Find_enclosed (x1, y1, x2, y2) Gibt eine Liste der Objekt-IDs aller Objekte, die vollständig innerhalb des Rechtecks, dessen obere linke Ecke (x1, y1) und die untere rechte Ecke auftritt (x2, y2).
.find_overlapping (x1, y1, x2, y2) Wie die vorherige Methode, sondern gibt eine Liste des Objekt-IDs aller Objekte, die mindestens einen Punkt mit dem angegebenen Rechteck teilen. "
Alle Ideen, wie dieses Problem beheben? Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. die tkinter Version ich habe, ist 8,5, ich habe Idle 3.1.1 und Python 3.1.1. Ich weiß, der PDF-Link i ist für 8.4 zur Verfügung gestellt, aber ich kann nicht vorstellen, dass es eine Änderung in diesen Funktionen war.
Danke!
Lösung
self.canvas.coords(name)
zurückgeben map object
und als Fehlerzustände map
Objekt ist unsubscriptable in Python 3. Sie müssen coords
ändern ein Tupel oder eine Liste sein.
Sie müssen den Code ändern zu sein:
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
Andere Tipps
Es gab mehrere wichtige Änderungen von Python 2.x auf Python 3.X -. Unter ihnen map
Funktionalität
Haben Sie führen Ihr Skript durch 2to3 noch?