Как обновить изображение на метке tkinter?

Я новичок в python, так что это может быть слишком простой вопрос, но мне нужна помощь. С помощью этого кода я не могу обновить изображение в метке 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. Но когда я снова открою другое изображение, я ожидаю, что он будет отображаться в том же ярлыке1, но этого не происходит. Я знаю, что второе изображение загружено, потому что размер окна изменяется соответственно, единственная проблема в том, что он не отображается, и я не могу понять, почему !.

  • Время составления графика в Python с Matplotlib
  • Удалить строку через маркер в легенде matplotlib
  • Django - наличие промежуточного программного обеспечения для связи с представлениями / шаблонами
  • Права доступа на уровне поля и Безопасность в openerp 7
  • Как работают операции numpy in-place (например, `+ =`)?
  • Преобразование RGB-изображения в оттенки серого и управление пиксельными данными в python
  • Преобразование текста, содержащего COMBINING DIAERESIS, в utf-8
  • Django Получить абсолютный URL для статических файлов
  • win32com import error python 3.4
  • Python: объект не поддерживает индексирование
  • Не удалось установить pyodbc в Linux
  • Библиотека Python Twitter: какой?
  • One Solution collect form web for “Как обновить изображение на метке tkinter?”

    Вместо того, чтобы создавать новую tk.Label каждый раз, setImage вызывается setImage , просто создайте его за пределами setImage – например, в initUI .

    Затем вы можете изменить изображение, вызвав self.label.configure :


     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() - 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() 
    Python - лучший язык программирования в мире.