Yat-il un bug Win32 Tkinter connu en ce qui concerne l'affichage des photos sur une toile?
-
05-09-2019 - |
Question
Je remarque un bug assez étrange avec tkinter, et je me demande si c'est parce qu'il ya quelque chose dans la façon dont le python interagit avec le tcl, au moins dans Win32.
Ici, j'ai un super programme simple qui affiche une image gif. Il fonctionne parfaitement.
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( )
Maintenant, je change le programme légèrement modifier l'objet de la toile à partir d'une fonction. Cette fois-ci, je viens obtenir une toile vierge.
# 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 seule différence entre les deux est que dans une toile de l'objet est passé à une fonction au lieu d'être utilisée directement. Les deux déclarations d'impression renvoient des résultats identiques. Je me demande s'il y a peut-être une rupture dans le modèle d'objet à la couche tcl / python.
Toutes les pensées, les gens?
Merci, / YGA
La solution
Faites cela comme une solution rapide, et je vais essayer d'expliquer:
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 doit avoir au moins une référence à partir d'un objet de python, sinon il est déchets collectés. Dans ma solution, je vous suggère de faire photo
être un nom au niveau du module, donc quand la fin de la fonction, il y aura encore une référence à l'objet PhotoImage. Vous préférez peut-être créer une classe et faire set_canvas
dans une méthode, et stocker l'objet PhotoImage comme une variable d'instance.