2017-09-18 13 views
1

수집되지에도 불구하고 표시되지 :Tkinter의 이미지는 다음이 t에 아무 것도 표시 원

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") 

나는 불꽃을 호출하고있어 두 번째 시간, p는 여전히 이미지를 기억합니다. 예외는 발생하지 않지만 이미지가 나타나지 않습니다.

그러나 :

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

이 작동하지

(I 일부 사용되지 않는 인수가 알고 있어요,하지만 그림은

def do(canvas, point, *_): 

하는 것이 필요할 다른 기능과 동일한 서명을 필요로 마찬가지로 좋음)

(사진, 화염, _pic2, 캔버스)는 모두 글로벌

+1

때로 믿을 수 'file' 키워드 매개 변수가 누락 되었습니까? 'PhotoImage ("...") 대신 PhotoImage (file = "...")'경로가 이미지의 "이름"입니다. –

답변

2

전혀 쓰레기가 모아지고있는 것이 아닌 것 같습니다. file 매개 변수 이름이 누락되었습니다. 따라서 경로가 대신 이미지의 "이름"으로 사용됩니다.

PhotoImage(file="../pic/small/"+name+".png")을 사용하면 문제를 해결할 수 있습니다.

그러나 가비지 수집과 관련하여 실제로는 p 함수를 list 매개 변수와 함께 사용할 필요가 없습니다. 이 함수는 pic 함수가 종료 된 후에도 do 함수의 범위에 남아 있기 때문에 PhotoImage을 함수의 로컬 변수로 정의 할 수있는 매우 드문 경우 중 하나이므로 가비지 수집되지 않습니다.

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 

(그것은 flame는하지만, 수집 될 때 수집,하지만 같은 당신의 접근 방식에 대한 사실이다.하지만 flame 글로벌 말했다,이 문제가되지해야 할됩니다.)

+0

나는 실제로 내부 P 함수가 필요하다. gc가 아니라 이미지를 로딩하는 것이 가능할 때까지 (왜 그런지는 알 수 없다.) –