-
tkinter를 class와 함께 사용하면 image가 사라져요.Python/이것저것 파이썬 2021. 11. 10. 08:01반응형
Without Class
클래스를 쓰지 않으면
이미지가 잘 출력됩니다.(JPEG 파일은 지원하지 않으니
PNG나 GIF를 이용합니다.)from tkinter import * root = Tk() root.title('컴닥') root.geometry('640x480') image = PhotoImage(file='test.png') # jpeg 파일은 지원하지 않습니다. label = Label(root, image=image, relief='sunken') label.pack() root.mainloop()
With Class
같은 코드를 클래스로 옮겨 봅니다.
from tkinter import * class App: def __init__(self, root): image = PhotoImage(file='test.png') # jpg 파일은 못 읽는 경우가 .... label = Label(root, image=image, relief='sunken') # label.image = image # 파이썬의 가비지 컬렉션의 삭제 방지. (레퍼런스 증가) label.pack() def main(): root = Tk() root.title('컴닥') root.geometry('640x480') App(root) root.mainloop() if __name__ == '__main__': main()
사진이 보이지 않습니다. :(
'# label.image = image'의 '#'을 제거해 주면...
이제야 보입니다.파이썬의 가비지 컬렉터(쓰레기 수집기)가 사진을 지워버리는 겁니다.
파이썬의 가비지 컬렉터는 레퍼런스 카운팅 방식으로 작동합니다.레퍼런스 카운팅은 객체의 참조 횟수를 체크해서,
참고 횟수가 0이 되면 삭제하는 방식입니다.수동으로 참고 횟수를 늘려줘야
이미지를 유지할 수 있습니다.파이썬 공식 문서에도 언급되어 있는 내용입니다.
image 옵션이 일부 위젯(예를 들어, 레이블, 버튼, 메뉴)에서 지원되는 곳이면 어디든 이미지 객체를 사용할 수 있습니다. 이 경우, Tk는 이미지에 대한 참조를 유지하지 않습니다. 이미지 객체에 대한 마지막 파이썬 참조가 삭제되면 이미지 데이터도 삭제되고, Tk는 이미지가 사용된 곳마다 빈 상자를 표시합니다.
https://docs.python.org/ko/3/library/tkinter.html기본 내장 GUI 라이브러리이기 때문에 tkinter를 쓰지만
파이써닉한 라이브러리는 아닌 것 같은 느낌입니다.TK가 처음부터 파이썬 용으로 제작된 GUI 툴킷이 아니라서 그런가...
* 참고: 예제로 배우는 파이썬 프로그래밍
* 참고: tkinter 정리가 잘 되어 있는 블로그
반응형