文件对话框、Tkinter和打开文件

49

我第一次尝试编写Python3程序中的浏览按钮。我已经在互联网上搜索过了这个网站,甚至Python标准库。

我找到了示例代码和非常肤浅的解释,但是我无法直接解决我面临的问题,也没有足够好的解释让我可以自定义代码以满足我的需求。

以下是相关片段:

Button(self, text = "Browse", command = self.load_file, width = 10)\
        .grid(row = 1, column = 0, sticky = W) .....


 def load_file(self):

    filename = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
                                                         ,("HTML files", "*.html;*.htm")
                                                         ,("All files", "*.*") ))
    if filename: 
        try: 
            self.settings["template"].set(filename)
        except: 
            messagebox.showerror("Open Source File", "Failed to read file \n'%s'"%filename)
            return
这个方法是我在途中找到的代码和我的自定义结合的混合体。虽然它(还)不完全符合我的需求,但似乎我终于让它工作了。
当我激活“浏览”按钮时,出现以下错误:NameError: global name 'filedialog' is not defined
我在途中找到了相似的问题,但所有建议的解决方案都已覆盖。我进入了IDLE的“filedialog”帮助部分,但也没有从那里得到任何线索。
请问有人能够详细解释和提供一些指导吗?我的书中没有专门介绍这个问题,我还检查了所有为他人提供的解决方案——我感到很迷茫。

5
你是否已经导入了它?from tkinter import filedialog - Thomas K
4个回答

68
你得到的异常告诉你filedialog不存在于你的命名空间中。filedialog(以及顺便提一句,messagebox)是一个tkinter模块,因此它不仅仅可以通过from tkinter import *导入。
>>> from tkinter import *
>>> filedialog
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'filedialog' is not defined
>>> 

你应该使用例如:

>>> from tkinter import filedialog
>>> filedialog
<module 'tkinter.filedialog' from 'C:\Python32\lib\tkinter\filedialog.py'>
>>>
或者
>>> import tkinter.filedialog as fdialog
或者
>>> from tkinter.filedialog import askopenfilename

所以这个代码适用于你的浏览按钮:

from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror

class MyFrame(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.title("Example")
        self.master.rowconfigure(5, weight=1)
        self.master.columnconfigure(5, weight=1)
        self.grid(sticky=W+E+N+S)

        self.button = Button(self, text="Browse", command=self.load_file, width=10)
        self.button.grid(row=1, column=0, sticky=W)

    def load_file(self):
        fname = askopenfilename(filetypes=(("Template files", "*.tplate"),
                                           ("HTML files", "*.html;*.htm"),
                                           ("All files", "*.*") ))
        if fname:
            try:
                print("""here it comes: self.settings["template"].set(fname)""")
            except:                     # <- naked except is a bad idea
                showerror("Open Source File", "Failed to read file\n'%s'" % fname)
            return


if __name__ == "__main__":
    MyFrame().mainloop()

在这里输入图片描述


3
谢谢。你知道,我在尝试从tkinter导入它们时出了些问题(仅仅是没有弄对),因为我没有完全正确,所以我把我的错误归咎于我没有犯错的地方。我的问题是:我认为'from tkinter import *' 导入了所有的tkinter。那么为什么还需要单独导入这些?你能给我指一些相关文档吗?再次感谢。 - Icsilk
我没有找到任何简单明了的解释链接。也许你会更幸运。首先查看Python的参考文档 - joaquin
这个解决方案的开头句告诉你为什么需要这两个语句。filedialog是一个模块,因此它不会随着“from tkinter import *”一起导入,必须单独导入。 - RufusVS

3

我需要先指定单个命令,然后使用 * 将所有命令一起执行。

from tkinter import filedialog
from tkinter import *

"从tkinter导入文件对话框"<br> "从tkinter导入*" - James
3
这些是模块,而不是命令。请您将其翻译成中文。 - Mad Physicist

2
你尝试过在fileName前面添加self前缀并替换按钮上方的方法吗?有了self,它就会在方法之间可见。
...

def load_file(self):
    self.fileName = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
                                                     ,("HTML files", "*.html;*.htm")
                                                     ,("All files", "*.*") ))
...

0

Tkinter实际上是一个Python包,或者说是一组Python文件的文件夹。请查找Python源代码以找到它。"tkinter.filedialog"是"tkinter.messagebox"的一部分。尝试使用"from tkinter.messagebox import filedialog"获取filedialog [python 3.7]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接