问openfilename没有定义? - 在 tkinter 中制作浏览按钮
askopenfilename is not defined? - Making a browse button in tkinter
我的代码的目的是创建一个有 4 个按钮的 GUI。其中 2 个是打开 "browse" window,允许用户 select 目录中的文件。第三个按钮是允许用户选择最终文档输出到的目录。第四个按钮将我的 python 代码应用于两个文件,创建输出文档。
在尝试创建 "browse" 按钮时,通过 Whosebug 和互联网上的许多帖子,大多数解决方案包括通常从 tkFileDialog 导入的 "askopenfilename" 模块。然而,无论我怎么说,或者我导入的 tkinter 模块的任何变体,我总是收到相同的 "no module name tkfileDialog" 或 "askopenfilename is not defined".
错误消息
我的代码有问题吗?这是在 python 3.6 的 tkinter 中发现的常见错误吗?如何创建一个用于查找文件并添加其路径的浏览按钮?
请告诉我!
谢谢。
下面是我的代码:
import os
#from tkFileDialog import *
from tkinter import filedialog
from Tkinter import *
from tkfileDialog import askopenfilename
content = 'apple'
file_path = 'squarebot'
#FUNCTIONS
def browsefunc(): #browse button to search for files
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
pathadd = os.path.dirname(filename)+filename
pathlabel.delete(0, END)
pathlabel.insert(0, pathadd)
return content
def open_file(): #also browse button to search for files - im trying various things to get this to work!
global content
global file_path
#filename = filedialog.askopenfilename(filetypes = (typeName {.txt},))
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
file_path = os.path.dirname(filename)
entry.delete(0, END)
entry.insert(0, file_path)
return content
def process_file(content): #process conversion code
print(content)
def directoryname():
directoryname = filedialog.askdirectory() # pick a folder
#GUI
root = Tk()
root.title('DCLF Converter')
root.geometry("598x600")
mf = Frame(root)
mf.pack()
f1 = Frame(mf, width=600, height=250) #DC file
f1.pack(fill=X)
f2 = Frame(mf, width=600, height=250) #LF file
f2.pack(fill=X)
f3 = Frame(mf, width=600, height=250) #destination folder
f3.pack(fill=X)
f4 = Frame(mf, width=600, height=250) #convert button
f4.pack()
file_path = StringVar
Label(f1,text="Select Your DC File (Only txt files)").grid(row=0, column=0, sticky='e') #DC button
entry = Entry(f1, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f2,text="Select Your LF File (Only csv files)").grid(row=0, column=0, sticky='e') #LF button
entry = Entry(f2, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f3,text="Select Your Destination Folder").grid(row=0, column=0, sticky='e') #destination folder button
entry = Entry(f3, width=50, textvariable=directoryname)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Button(f1, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#DC button
Button(f2, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#LF button
Button(f3, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#destination folder button
Button(f4, text="RECONCILE NOW", width=32, command=lambda: process_file(content)).grid(sticky='ew', padx=10, pady=10)#convert button
root.mainloop()
P.S 如果您在我的代码中发现任何其他错误,请告诉我。我刚开始使用 tkinter,因此这可能归因于完全不相关的事情!
非常感谢
模块名称有误。
因为python版本是3.6所以你需要使用filedialog库。包括应该是这个样子:
import os
from tkinter import *
import tkinter.filedialog
或
import os
from tkinter import *
from tkinter import filedialog
问题实际上是我需要将 askopenfilename() 附加到 filedialog,正如 Roars 在现已删除的评论中提到的那样!(它看起来像这样 --> filedialog.askopenfilename()。
这是我在我的代码中使用的,因此它可以在 Python 2 和 3 中与 Tkinter 模块一起使用:
try:
import Tkinter as tk
import ttk
from tkFileDialog import askopenfilename
import tkMessageBox
import tkSimpleDialog
from tkSimpleDialog import Dialog
except ModuleNotFoundError: # Python 3
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox as tkMessageBox
import tkinter.simpledialog as tkSimpleDialog
from tkinter.simpledialog import Dialog
您要求通知任何其他错误,我注意到您使用 askopenfilename
的方式看起来不对。具体来说,filetypes
关键字参数应该是包含文件类型名称和模式的二元组序列,这些名称和模式将 select 出现在文件列表中。因此,对于文本文件,您将使用:
filename = askopenfilename(filetypes=[('text files', '*.txt')])
我通常还包含一个通用模式,以便轻松访问具有其他扩展名的文件:
filename = askopenfilename(filetypes=[('text files', '*.txt'), ("all files", "*")])
无论哪种方式,重要的是要记住检查返回的值,因为它可能是用户没有 select 任何东西的空字符串。
你可以试试这个:
from tkinter.filedialog import askopenfilename
我的代码的目的是创建一个有 4 个按钮的 GUI。其中 2 个是打开 "browse" window,允许用户 select 目录中的文件。第三个按钮是允许用户选择最终文档输出到的目录。第四个按钮将我的 python 代码应用于两个文件,创建输出文档。
在尝试创建 "browse" 按钮时,通过 Whosebug 和互联网上的许多帖子,大多数解决方案包括通常从 tkFileDialog 导入的 "askopenfilename" 模块。然而,无论我怎么说,或者我导入的 tkinter 模块的任何变体,我总是收到相同的 "no module name tkfileDialog" 或 "askopenfilename is not defined".
错误消息我的代码有问题吗?这是在 python 3.6 的 tkinter 中发现的常见错误吗?如何创建一个用于查找文件并添加其路径的浏览按钮?
请告诉我!
谢谢。
下面是我的代码:
import os
#from tkFileDialog import *
from tkinter import filedialog
from Tkinter import *
from tkfileDialog import askopenfilename
content = 'apple'
file_path = 'squarebot'
#FUNCTIONS
def browsefunc(): #browse button to search for files
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
pathadd = os.path.dirname(filename)+filename
pathlabel.delete(0, END)
pathlabel.insert(0, pathadd)
return content
def open_file(): #also browse button to search for files - im trying various things to get this to work!
global content
global file_path
#filename = filedialog.askopenfilename(filetypes = (typeName {.txt},))
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
file_path = os.path.dirname(filename)
entry.delete(0, END)
entry.insert(0, file_path)
return content
def process_file(content): #process conversion code
print(content)
def directoryname():
directoryname = filedialog.askdirectory() # pick a folder
#GUI
root = Tk()
root.title('DCLF Converter')
root.geometry("598x600")
mf = Frame(root)
mf.pack()
f1 = Frame(mf, width=600, height=250) #DC file
f1.pack(fill=X)
f2 = Frame(mf, width=600, height=250) #LF file
f2.pack(fill=X)
f3 = Frame(mf, width=600, height=250) #destination folder
f3.pack(fill=X)
f4 = Frame(mf, width=600, height=250) #convert button
f4.pack()
file_path = StringVar
Label(f1,text="Select Your DC File (Only txt files)").grid(row=0, column=0, sticky='e') #DC button
entry = Entry(f1, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f2,text="Select Your LF File (Only csv files)").grid(row=0, column=0, sticky='e') #LF button
entry = Entry(f2, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f3,text="Select Your Destination Folder").grid(row=0, column=0, sticky='e') #destination folder button
entry = Entry(f3, width=50, textvariable=directoryname)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Button(f1, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#DC button
Button(f2, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#LF button
Button(f3, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#destination folder button
Button(f4, text="RECONCILE NOW", width=32, command=lambda: process_file(content)).grid(sticky='ew', padx=10, pady=10)#convert button
root.mainloop()
P.S 如果您在我的代码中发现任何其他错误,请告诉我。我刚开始使用 tkinter,因此这可能归因于完全不相关的事情!
非常感谢
模块名称有误。
因为python版本是3.6所以你需要使用filedialog库。包括应该是这个样子:
import os
from tkinter import *
import tkinter.filedialog
或
import os
from tkinter import *
from tkinter import filedialog
问题实际上是我需要将 askopenfilename() 附加到 filedialog,正如 Roars 在现已删除的评论中提到的那样!(它看起来像这样 --> filedialog.askopenfilename()。
这是我在我的代码中使用的,因此它可以在 Python 2 和 3 中与 Tkinter 模块一起使用:
try:
import Tkinter as tk
import ttk
from tkFileDialog import askopenfilename
import tkMessageBox
import tkSimpleDialog
from tkSimpleDialog import Dialog
except ModuleNotFoundError: # Python 3
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox as tkMessageBox
import tkinter.simpledialog as tkSimpleDialog
from tkinter.simpledialog import Dialog
您要求通知任何其他错误,我注意到您使用 askopenfilename
的方式看起来不对。具体来说,filetypes
关键字参数应该是包含文件类型名称和模式的二元组序列,这些名称和模式将 select 出现在文件列表中。因此,对于文本文件,您将使用:
filename = askopenfilename(filetypes=[('text files', '*.txt')])
我通常还包含一个通用模式,以便轻松访问具有其他扩展名的文件:
filename = askopenfilename(filetypes=[('text files', '*.txt'), ("all files", "*")])
无论哪种方式,重要的是要记住检查返回的值,因为它可能是用户没有 select 任何东西的空字符串。
你可以试试这个:
from tkinter.filedialog import askopenfilename