2

私は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 に表示されます。しかし、もう一度別の画像を開くと、同じ label1 に表示されることを期待していますが、それは起こっていません。ウィンドウサイズがそれに応じてサイズ変更されたため、2番目の画像が読み込まれていることはわかっています.

4

1 に答える 1

4

tk.Labelが呼び出されるたびに新しい を作成する代わりに、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()
于 2013-01-12T11:16:50.477 に答える