文件对话框、tkinter 和打开文件
Posted
技术标签:
【中文标题】文件对话框、tkinter 和打开文件【英文标题】:filedialog, tkinter and opening files 【发布时间】:2012-03-03 14:45:29 【问题描述】:我第一次为 Python3 中的程序编写浏览按钮。我一直在搜索互联网和这个网站,甚至是 python 标准库。
我找到了示例代码和对事物的非常肤浅的解释,但我无法找到任何可以直接解决我遇到的问题的内容,或者找到足够好的解释,以便我可以根据需要自定义代码。
这里是相关的sn-p:
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 的“文件对话框”帮助部分,但也没有从那里收集任何内容。
有人介意对此提供一个细分和一些指导吗?我的书都没有专门解决这个问题,我已经检查了提供给其他人的所有解决方案——我迷路了。
【问题讨论】:
你导入了吗?from tkinter import filedialog
【参考方案1】:
您得到的异常是告诉您filedialog
不在您的命名空间中。
filedialog
(和 btw 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()
【讨论】:
谢谢。你知道,我把它们都从 tkinter 导入搞砸了(只是没有完全正确),而且因为我没有完全正确,所以我把我的错误归咎于我没有犯错的地方。我的问题是:我认为'从 tkinter import *' 导入了所有的 tkinter。那么为什么这些必须单独进口呢?你能告诉我一些关于这个的文件吗?再次感谢 我没有找到任何简单、中肯的解释链接。也许你有更多的运气。检查第一个 python reference 和 docs 这个解决方案的开头句告诉你为什么需要这两个语句。 filedialog 是一个模块,因此它不会通过“from tkinter import *”导入,必须单独导入。【参考方案2】:我必须先指定单个命令,然后使用*
将所有命令引入。
from tkinter import filedialog
from tkinter import *
【讨论】:
"从 tkinter 导入文件对话框" "从 tkinter 导入 *" 挑剔命名法:这些是模块,而不是命令。【参考方案3】:您是否尝试将 self 前缀添加到 fileName 并替换 Button 上方的方法?有了 self,它在方法之间变得可见。
...
def load_file(self):
self.fileName = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
,("HTML files", "*.html;*.htm")
,("All files", "*.*") ))
...
【讨论】:
【参考方案4】:Tkinter 实际上是一个 python 包,或者是一个 python 文件的文件夹。检查python源以找到它。 “tkinter.filedialog”是“tkinter.messagebox”的一部分尝试“from tkinter.messagebox import filedialog”来获取filedialog [python 3.7]。
【讨论】:
以上是关于文件对话框、tkinter 和打开文件的主要内容,如果未能解决你的问题,请参考以下文章
调用 tkinter askopenfilename 方法后打开文件对话框冻结
python 打开文件对话框 filedialog tkinter GUI 编程
什么可能导致 Tkinter/Python 中打开的文件对话框窗口在用户选择文件后关闭速度真的很慢?