Por que no mundo não Tkinter quebrar usando canvas.create_image?
-
05-07-2019 - |
Pergunta
Eu tenho um aplicativo de python GUI no funcionamento, o que eu pretendo usar no Windows e Mac. A documentação sobre Tkinter não é o maior, e google-fu me falhou.
Em suma, estou fazendo:
c = Canvas(
master=frame,
width=settings.WINDOW_SIZE[0],
height=settings.WINDOW_SIZE[1],
background=settings.CANVAS_COLOUR
)
file = PhotoImage(file=os.path.join('path', 'to', 'gif'))
c.create_bitmap(position, image=file)
c.pack()
root.mainloop()
Se eu comente a linha create_bitmap, o aplicativo desenha bem. Se eu comentá-lo de volta, eu recebo o seguinte erro:
_tkinter.TclError: unknown option "-image"
O que é estranho. Tkinter é fino, de acordo com os testes python (ou seja, a importação de _tkinter, tkinter, e fazendo Tk()
). Eu já PIL instalado contra a minha instalação do Windows (XP SP3, Python 2.6) imaginando que ele estava fazendo algum do trabalho pesado em um nível baixo. Não parece ser; Eu ainda obter o erro acima mencionado.
O StackTrace completo, excluindo o código que eu já colado, é:
File "C:\Python26\lib\lib-tk\Tkinter.py", line 2153, in create_bitmap
return self._create('bitmap', args, kw)
File "C:\Python26\lib\lib-tk\Tkinter.py", line 2147, in _create
*(args + self._options(cnf, kw))))
Qualquer pessoa capaz de lançar alguma luz?
Solução
Tk tem dois tipos de gráficos, bitmap e imagem. Imagens vêm em dois sabores, bitmap e foto. Bitmaps e imagens do tipo bitmap não são a mesma coisa, o que leva a confusão em docs. PhotoImage cria uma imagem do tipo de fotografia, e precisa de um objeto imagem na tela, então a solução é, como você já concluído, para uso create_image.
Outras dicas
Resposta curta: Não use create_bitmap quando você significa para uso create_image.
O método create_bitmap()
não tem um argumento image
; ele tem um argumento bitmap
.
O erro você recebe vem do fato de que em Tkinter, um interpretador Tcl está funcionando incorporado no processo de Python, e toda a interação GUI vai e volta entre Python e Tcl; assim, o erro você recebe vem do fato de que Tcl responde: "Eu não sei qualquer opção -image na chamada .create_bitmap".
Em qualquer caso, como Jeff disse, você provavelmente quer o método create_image
.