从python中的菜单回调返回由tkFileDialog读取的文件名时出错

时间:2013-01-05 17:39:52

标签: python tkinter

我是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()

我甚至尝试过为filename创建一个属性,但没有帮助.......

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

这种行为是可以预期的。当您print self.fn initUI时,用户尚未选择文件。当您在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