0

私はpythonの初心者です。クリックするとtkFileDialogで画像ファイルを要求するメニュー項目「開く」がある単純なGUIでコードを書いています。ファイル名とパスを読み取っても問題ありません。ファイル名を返して、画像を開いてtkinter Labelに表示できるようにします。しかし、ファイル名を返す方法がわかりません。

ここに私のコードがあります

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)
        fileMenu = Menu(menubar)
        self.fn=''
        fileMenu.add_command(label="Open", command=self.onOpen)
        menubar.add_cascade(label="File", menu=fileMenu)
        print self.fn #prints nothing here
        #self.img=Image.open(self.fn)


    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


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

def main():

    root = Tk()
    ex = DIP(root)
    root.geometry("1280x720")
    root.mainloop()  


if __name__ == '__main__':
    main()

ファイル名の属性を作成してみましたが、助けにはなりません........

4

2 に答える 2

1

コードを詳しく見てください。initUI()の前に実行していて、設定の後にイメージを設定する をonOpen()実行していません。initUI()self.fn

これを修正するには、次のように、画像ラベルをクラス内の別の関数に変更するコードを移動する必要があります。

def setImage(self):
    print self.fn #prints something now!
    self.img=Image.open(self.fn)

次に、 の最後でonOpen()、この関数を呼び出す必要があります。

def onOpen(self):
    ...
    self.setImage()
于 2013-01-05T18:01:36.877 に答える
1

この動作は予期されたものです。ユーザーがまだファイルを選択していないprint self.fn場合。ユーザーがファイルを選択してinitUI印刷すると、正しく表示されます。正しく設定されていない場合は、印刷が早すぎます。onOpenself.fn

画像を表示したい場合は、ユーザーがファイルを選択してから行ってください。

def onOpen(self):
    ftypes = [('Image Files', '*.tif *.jpg *.png')]
    dlg = tkFileDialog.Open(self, filetypes = ftypes)
    filename = dlg.show()
    self.fn = filename
    if self.fn: # If a file was selected
        # Display image in label / call display function
于 2013-01-05T18:02:21.970 に答える