캔버스에 사진을 표시하는 것과 관련하여 알려진 Win32 Tkinter 버그가 있습니까?

StackOverflow https://stackoverflow.com/questions/576843

문제

나는 Tkinter와 함께 꽤 이상한 버그를 주목하고 있으며, Python이 적어도 Win32에서 TCL과 상호 작용하는 방식에 무언가가 있기 때문인지 궁금합니다.

여기에 GIF 이미지를 표시하는 매우 간단한 프로그램이 있습니다. 완벽하게 작동합니다.

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

이제 기능 내에서 캔버스 개체를 편집하기 위해 프로그램을 약간 변경합니다. 이번에는 빈 캔버스를 얻습니다.

# 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( )

둘 사이의 유일한 차이점은 하나에서 캔버스 객체가 직접 사용하는 대신 함수로 전달된다는 것입니다. 두 인쇄 문은 동일한 결과를 반환합니다. TCL/Python 레이어에서 객체 모델에 약간의 분해가 있는지 궁금합니다.

어떤 생각, 여러분?

감사합니다, /yga

도움이 되었습니까?

해결책

빠른 솔루션으로 그렇게하면 다음과 같이 설명해 드리겠습니다.

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

Photogimage는 Python 객체로부터 적어도 하나의 참조를 가져야하며, 그렇지 않으면 쓰레기가 수집되었습니다. 내 해결책에서는 만들 것을 제안합니다 photo 모듈 레벨 이름이되므로 함수가 종료되면 여전히 Photoimage 객체에 대한 참조가 있습니다. 수업을 만들고 만들기를 선호 할 수 있습니다 set_canvas 메소드로, Photoimage 객체를 인스턴스 변수로 저장하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top