0

我是python的初学者。我正在编写一个带有简单 GUI 的代码,其中有一个菜单项“打开”,单击该菜单项时会询问带有tkFileDialog的图像文件。读取文件名和路径很好。我希望返回文件名,以便可以在 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)
        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.fninitUI用户中尚未选择文件时。当您在onOpen用户中打印时选择了一个文件,因此它可以正常显示。self.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 回答