¿Hay un error conocido de Win32 Tkinter con respecto a la visualización de fotos en un lienzo?

StackOverflow https://stackoverflow.com/questions/576843

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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top