Por que eu tenho este TypeError quando se utiliza tkinter?
-
05-07-2019 - |
Pergunta
então eu atualizado para python 3.1.1 de 2,6 e eu corri um velho programa de mina que usa tkinter.
Eu recebo a seguinte mensagem de erro que não me lembro de ficar na versão 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
Eu tenho certeza que a linha
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])
foi ok na versão mais antiga. Eu não tenho certeza o que mudou para que a maneira que eu obter cada coordenada não é possível.
". Find_enclosed (x1, y1, x2, y2) Retorna uma lista dos IDs de objeto de todos os objetos que ocorrem completamente dentro do retângulo cuja parte superior esquerda canto é (x1, y1) e canto inferior direito é (x2, y2).
.find_overlapping (x1, y1, x2, y2) Como o método anterior, mas retorna uma lista de IDs de objetos de todos os objetos que compartilham pelo menos um ponto com o retângulo dado. "
Algumas ideias sobre como consertar isso? por favor deixe-me saber se você precisar de mais informações. a versão tkinter eu tenho é de 8,5, tenho ocioso 3.1.1 e 3.1.1 python. eu sei o link pdf i fornecido é para 8,4, mas eu não posso imaginar que houve uma mudança nessas funções.
Obrigado!
Solução
self.canvas.coords(name)
retornar um map object
, e como o objeto estados de erro map
é unsubscriptable em python 3. Você precisa mudar coords
ser uma tupla ou uma lista.
você precisa alterar seu código a ser:
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
Outras dicas
Houve várias alterações significativas de Python 2.x para o Python 3.x -. Entre eles, a funcionalidade do map
Você executar o script através 2to3 ainda?