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!

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top