我是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创建一个属性,但没有帮助.......
答案 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