2013-01-12 3 views
1

저는 파이썬에서 초보자입니다. 그래서 이것은 너무 간단한 질문 일지 모르지만 도움이 필요합니다.이 코드로 나는 tkinter 라벨의 이미지를 업데이트 할 수 없습니다. 새로운로드 된 이미지의 속성에 따라 창 크기를 조정할 수도 있지만 새 이미지는 tkinter 레이블에 표시되지 않습니다.tkinter 레이블에서 이미지를 업데이트하는 방법은 무엇입니까?

from Tkinter import Frame, Tk, Label, Text, Menu, END, BOTH, StringVar 
from PIL import ImageTk, Image 
import numpy 
import tkFileDialog 

class DIP(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent   
     self.initUI() 

def initUI(self): 

    self.parent.title("DIP Algorithms- Simple Photo Editor") 
    self.pack(fill=BOTH, expand=1) 

    menubar = Menu(self.parent) 
    self.parent.config(menu=menubar) 

    #Open Image Menu 
    fileMenu = Menu(menubar) 
    fileMenu.add_command(label="Open", command=self.onOpen) 
    menubar.add_cascade(label="File", menu=fileMenu) 

    #menu for image ngative 
    basicMenu=Menu(menubar) 
    basicMenu.add_command(label="Negative", command=self.onNeg) 
    menubar.add_cascade(label="Basic", menu=basicMenu) 

#Image Negative Menu callback 
def onNeg(self): 
    I2=255-self.I; 
    im = Image.fromarray(numpy.uint8(I2)) 
    photo2=ImageTk.PhotoImage(im) 
    self.label2= Label(self.parent,border=25,image=photo2) 
    self.label2.image = photo2 # keep a reference! 
    self.label2.grid(row=1, column=2) 


def setImage(self): 

    self.img=Image.open(self.fn) 
    self.I = numpy.asarray(self.img) 
    l,h = self.img.size 
    text=str(2*l+100)+"x"+str(h+50)+"+0+0" 
    self.parent.geometry(text) 
    photo = ImageTk.PhotoImage(self.img) 
    self.label1 = Label(self.parent,border=25,image=photo) 
    self.label1.configure(image=photo) 
    self.label1.image = photo # keep a reference! 
    self.label1.grid(row=1, column=1) 

#Open Callback 
def onOpen(self): 

    ftypes = [('Image Files', '*.tif *.jpg *.png')] 
    dlg = tkFileDialog.Open(self, filetypes = ftypes) 
    filename = dlg.show() 
    self.fn=filename 
    #print self.fn #prints filename with path here 
    self.setImage() 

#def onError(self): 
    #box.showerror("Error", "Could not open file")  

def main(): 

    root = Tk() 
    DIP(root) 
    root.geometry("320x240") 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

이 코드를 실행하고 이미지를 열면 label1에 표시됩니다. 그러나 다른 이미지를 다시 열면 같은 라벨에 표시되기를 기대하지만 그럴 수는 없습니다. 나는 창 크기가 그에 따라 크기가 조정 되었기 때문에 두 번째 이미지가로드된다는 것을 알고 있습니다. 유일한 문제는 그것이 표시되지 않고 그 이유를 파악할 수 없다는 것입니다.

답변

2

setImage을 호출 할 때마다 새 tk.Label을 작성하는 대신 외부에서 한 번만 작성하십시오 (예 : initUI). `

`self.label1.image = 사진 # @unubtu
import Tkinter as tk 
import Image 
import ImageTk 
import numpy as np 
import tkFileDialog 

class DIP(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent   
     self.initUI() 

    def initUI(self): 
     self.parent.title("DIP Algorithms- Simple Photo Editor") 
     self.pack(fill = tk.BOTH, expand = 1) 

     menubar = tk.Menu(self.parent) 
     self.parent.config(menu = menubar) 

     self.label1 = tk.Label(self, border = 25) 
     self.label2 = tk.Label(self, border = 25) 
     self.label1.grid(row = 1, column = 1) 
     self.label2.grid(row = 1, column = 2) 

     #Open Image Menu 
     fileMenu = tk.Menu(menubar) 
     fileMenu.add_command(label = "Open", command = self.onOpen) 
     menubar.add_cascade(label = "File", menu = fileMenu) 

     #menu for image ngative 
     basicMenu = tk.Menu(menubar) 
     basicMenu.add_command(label = "Negative", command = self.onNeg) 
     menubar.add_cascade(label = "Basic", menu = basicMenu) 

    def onNeg(self): 
     #Image Negative Menu callback 
     I2 = 255-self.I; 
     im = Image.fromarray(np.uint8(I2)) 
     photo2 = ImageTk.PhotoImage(im) 
     self.label2.image = photo2 # keep a reference! 

    def setImage(self): 
     self.img = Image.open(self.fn) 
     self.I = np.asarray(self.img) 
     l, h = self.img.size 
     text = str(2*l+100)+"x"+str(h+50)+"+0+0" 
     self.parent.geometry(text) 
     photo = ImageTk.PhotoImage(self.img) 
     self.label1.configure(image = photo) 
     self.label1.image = photo # keep a reference! 

    def onOpen(self): 
     #Open Callback 
     ftypes = [('Image Files', '*.tif *.jpg *.png')] 
     dlg = tkFileDialog.Open(self, filetypes = ftypes) 
     filename = dlg.show() 
     self.fn = filename 
     #print self.fn #prints filename with path here 
     self.setImage() 

    #def onError(self): 
     #box.showerror("Error", "Could not open file")  

def main(): 

    root = tk.Tk() 
    DIP(root) 
    root.geometry("320x240") 
    root.mainloop() 


if __name__ == '__main__': 
    main() 
+0

이 참조를 유지하는 중요한 이유에 대한 참조를 유지하고있다!

그런 다음 self.label.configure를 호출하여 이미지를 변경할 수 있습니까? – Nancy

+0

@ 낸시 : 좋은 질문입니다. [PhotoImages를 참고해야하는 이유] (http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm)를 참조하십시오. – unutbu

관련 문제