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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top