2013-01-05 23 views
0

我是一个Python初学者。我正在编写一个简单的GUI代码,其中有一个菜单项“打开”,当点击时请求图像文件与tkFileDialog。它可以很好地读取文件名和路径。我想要返回文件名以便图像可以在tkinter Label中打开和显示。但我不知道如何返回文件名。错误返回文件名读取由tkFileDialog从Python中的菜单回调

这里是我的代码

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

我甚至通过创建文件名的属性尝试过,但没有帮助.......

回答

1

更仔细你的代码。您在onOpen()之前运行initUI(),然后您未运行initUI(),该设置在设置self.fn后设置图像。

要解决这个问题,你需要将你的代码,改变图像标签到另一个功能类,像这样:然后

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

,在onOpen()最后,你需要调用这个函数。

def onOpen(self): 
    ... 
    self.setImage() 
+0

感谢您的回答。我也需要其他回调中的图片。我怎样才能做到这一点? – bistaumanga

+1

'self.img'被'setImage(self)'设置一次后,它被打开后,它应该总是可用于其他回调作为'self.img'。 –

+0

非常感谢您的指导。我的问题解决了。 – bistaumanga

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 
+0

感谢您的答案。我还需要其他回调中显示的图像。我怎样才能做到这一点? – bistaumanga

相关问题