¿Hay un error conocido de Win32 Tkinter con respecto a la visualización de fotos en un lienzo?
-
05-09-2019 - |
Pregunta
Estoy notando un muy extraño error con tkinter, y me pregunto si es porque hay algo en la forma en la pitón interactúa con el TCL, por lo menos en Win32.
Aquí tengo un programa muy simple que muestra una imagen gif. Funciona perfectamente.
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
photo=PhotoImage(file=sys.argv[1])
canvas.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print canvas
print photo
mainloop( )
Ahora, puedo cambiar el programa ligeramente para editar el objeto de lona dentro de una función. Esta vez, acaba de obtener un lienzo en blanco.
# demo all basic canvas interfaces
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
def set_canvas(cv):
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
set_canvas(canvas)
mainloop( )
La única diferencia entre los dos es que en un objeto de la lona se pasa a una función en lugar de ser utilizado directamente. Ambas declaraciones de impresión vuelven idénticos resultados. Me pregunto si hay tal vez algunos ruptura en el modelo de objetos en la capa de TCL / pitón.
Cualquier pensamiento, amigos?
Gracias, / YGA
Solución
Hacer eso como una solución rápida, y voy a tratar de explicar:
def set_canvas(cv):
global photo # here!
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
A PhotoImage tiene que tener al menos una referencia de cualquier objeto Python, por lo demás es basura recogida. En mi solución, Propongo hacer photo
ser un nombre de nivel de módulo, por lo que cuando termina la función, todavía habrá una referencia al objeto PhotoImage. Es posible que prefiera para crear una clase y hacer set_canvas
en un método, y almacene el objeto PhotoImage como una variable de instancia.