2017-09-18 1 views
1

ce qui suit gagné t afficher quoi que ce soit:image tkinter ne pas afficher dépit de ne pas être collecté

def pic(name): 
    def p(image=[]): #keep a reference to the image, but only load after creating window 
     if not image: 
      image.append(PhotoImage("../pic/small/"+name+".png")) 
     return image[0] 
    def do(canvas, point, angle, size, fill, outline): 
     canvas.create_image(*point, image=p(), tag="visual") 
    return do 

flame = pic("flame") 

flame(canvas, (100, 200), 0, 30, "red", "blue") 

La deuxième fois que je suis appelle flamme, p se souvient encore de son image. Aucune exception ne se produit, mais l'image n'apparaît pas.

cependant:

_pic2 = PhotoImage(file="../pic/small/flame.png") 
canvas.create_image(300, 200, image=_pic2) 

fonctionne

(je suis conscient qu'il ya des arguments inutilisés, mais pic a besoin de la même signature que d'autres fonctions qui en ont besoin

def do(canvas, point, *_): 

serait tout aussi bon)

(pic, flamme, _pic2, toile) sont globales

+1

Aren 't vous manque juste le paramètre de mot-clé 'file'? 'PhotoImage (file =" ... ")' au lieu de 'PhotoImage (" ... ")' Sans cela, le chemin est le "nom" de l'image. –

Répondre

2

Le problème ne semble pas être l'image étant recueillie du tout. Il vous manque juste le nom du paramètre file, ainsi le chemin est utilisé comme "nom" de l'image à la place.

L'utilisation de PhotoImage(file="../pic/small/"+name+".png") devrait résoudre ce problème. Cependant, en parlant de garbage collection, vous n'avez pas besoin de la fonction interne p avec le paramètre list. C'est l'un des rares cas où vous pouvez simplement définir le PhotoImage en tant que variable locale dans la fonction, car il restera dans la portée de la fonction do même après que la fonction pic aura quitté, et ne sera donc pas récupérée.

def pic(name): 
    img = PhotoImage(file="../pic/small/"+name+".png") 
    def do(canvas, point, angle, size, fill, outline): 
     canvas.create_image(*point, image=img, tag="visual") 
    return do 

(Il sera recueillir lorsque flame est recueilli, cependant, mais la même chose est vraie pour votre approche. Mais comme vous le dites flame est mondiale, cela ne devrait pas être un problème.)

+0

J'ai vraiment besoin de la fonction p interne, pas pour gc mais pour retarder le chargement de l'image jusqu'à ce qu'il soit possible de le faire (aucune idée de pourquoi cela est nécessaire cependant) –