C'è un bug noto Win32 Tkinter rispetto alla visualizzazione delle foto su una tela?
-
05-09-2019 - |
Domanda
sto notando un bel strano bug con Tkinter, e mi chiedo se è perché c'è qualcosa nel modo in cui il pitone interagisce con il TCL, almeno in Win32.
Qui ho una super semplice programma che visualizza un'immagine GIF. Funziona perfettamente.
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( )
Ora, a cambiare il programma un po 'per modificare l'oggetto di tela all'interno di una funzione. Questa volta, ho appena ottenere una tela bianca.
# 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( )
L'unica differenza tra i due è che in un oggetto tela viene passato a una funzione invece di essere utilizzato direttamente. Entrambe le dichiarazioni di stampa restituiscono risultati identici. Mi chiedo se non c'è forse qualche guasto nel modello a oggetti a livello di TCL / python.
Ogni pensiero, gente?
Grazie, / YGA
Soluzione
fare che come una soluzione rapida, e cercherò di spiegare:
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 deve avere almeno un riferimento da qualsiasi oggetto Python, altrimenti è garbage collection. Nella mia soluzione, vi suggerisco di fare photo
essere un nome a livello di modulo, in modo che quando la funzione termina, ci sarà ancora un riferimento all'oggetto PhotoImage. Si potrebbe preferire di creare una classe e fare set_canvas
in un metodo, e memorizzare l'oggetto PhotoImage come una variabile di istanza.