2012-10-30 7 views
3

일부 tkinter를 배우려고합니다. 아이콘을 표시하려면 tkinter를 가져올 수 없습니다. 나는 그것이 어디서 잘못되는지 모른다. 어떤 오류도 발생하지 않으며 이미지의 크기를 존중하지만 보이지 않습니다. 온라인에서 발견 한 모든 것은 파이썬에서 가비지 수집을 막기 위해 두 번째 참조를 추가하라고 알려주지 만, 어쨌든 이것은 트릭이 아닙니다. 당신이 Tkinter를 위젯에 광 화상 또는 다른 이미지 개체를 추가 할 때Tkinter 레이블이 표시되지 않습니다.

from Tkinter import * 
from PIL import Image, ImageTk 

class GUI: 

    def __init__(self, master): 

     frame = Frame(master) 
     frame.pack() 

     #status bar 
     self.bar = Frame(root, relief=RIDGE, borderwidth=5) 
     self.bar.pack(side=TOP) 

     self.iconPath = 'data/icons/size.png' 
     self.icon = ImageTk.PhotoImage(Image.open(self.iconPath)) 
     self.icon_size = Label(self.bar, image = self.icon) 
     self.icon_size.pack(side=LEFT) 

root = Tk() 


app = GUI(root) 

root.mainloop() 
+1

들여 쓰기가 엉망입니다. –

+1

고정 들여 쓰기 기능을 사용하면 코드가 작동합니다. 레이블 (JPEG 및 PNG)에 이미지가 표시됩니다. – Tim

+0

들여 쓰기를 수정했습니다. 코드가 여전히 나를 위해 이미지를 표시하지 않습니다. – user1787062

답변

6

, 당신은 이미지 객체에 대한 자신의 참조를 유지해야합니다 다음은 잘못 내 코드의 일부입니다. 그렇지 않으면 이미지가 항상 나타나지는 않습니다. 당신이 그것을 표시하기 위해서는 위젯에 이미지 객체를 고정해야한다

어떤 이유로 결정 here

+0

이 문제는 해결되었지만 모두 투표에서 제외되었습니다. . – Elvisjames

2

은 (내가 왜 정확히 이해하지 않는다). 따라서 코드에서 다음 변경을 시도하십시오.

from Tkinter import * 
from PIL import Image, ImageTk 

class GUI: 

    def __init__(self, master): 

     frame = Frame(master) 
     frame.pack() 

     #status bar 
     self.bar = Frame(root, relief=RIDGE, borderwidth=5) 
     self.bar.pack(side=TOP) 

     self.iconPath = 'data/icons/size.png' 
     self.icon = ImageTk.PhotoImage(Image.open(self.iconPath)) 
     self.icon_size = Label(self.bar) 
     self.icon_size.image = self.icon # <== this is were we anchor the img object 
     self.icon_size.configure(image=self.icon) 
     self.icon_size.pack(side=LEFT) 

root = Tk() 


app = GUI(root) 

root.mainloop() 

행운을 비네!

+2

"왜"는 파이썬 가비지 수집이 영구적 인 참조가 아니라면 이미지를 파괴하기 때문입니다. –

1

앞으로의 모든 독자에게, 제 경우에는 문제가 투명성으로 거짓말을합니다. 이미지에서 알파 채널을 제거하면 고정되었습니다.

관련 문제