Domanda

quindi ho eseguito l'aggiornamento a python 3.1.1 dalla 2.6 e ho eseguito un mio vecchio programma che utilizza tkinter.

Ricevo il seguente messaggio di errore che non ricordo di aver ricevuto nella versione 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

Sono abbastanza sicuro della linea

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

era ok nella versione precedente. Non sono sicuro di cosa sia cambiato in modo che il modo in cui ottengo ciascuna coordinata non sia possibile.

dai tkinter docs (pdf)

  

" .find_enclosed (x1, y1, x2, y2)   Restituisce un elenco degli ID oggetto di tutti gli oggetti che si verificano completamente all'interno del rettangolo il cui angolo superiore sinistro è (x1, y1) e l'angolo inferiore destro è (x2, y2).

     

.find_overlapping (x1, y1, x2, y2)   Come il metodo precedente, ma restituisce un elenco degli ID oggetto di tutti gli oggetti che condividono almeno un punto con il rettangolo specificato. & Quot;

qualche idea su come risolvere questo problema? per favore fatemi sapere se avete bisogno di maggiori informazioni. la versione di tkinter che ho è 8.5, ho idle 3.1.1 e python 3.1.1. so che il link pdf che ho fornito è per 8.4, ma non riesco a immaginare che ci sia stato un cambiamento in queste funzioni.

grazie!

È stato utile?

Soluzione

self.canvas.coords(name)

restituisce un oggetto mappa e, come indicato dall'errore, l'oggetto map non è sottoscrivibile in Python 3. devi cambiare coords per essere un tupla o un elenco.

devi cambiare il tuo codice in:

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

Altri suggerimenti

Ci sono state diverse modifiche da Python 2.X a Python 3.X, tra cui la funzionalità map .

Hai già eseguito il tuo script attraverso 2to3 ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top