在Python中快速便捷的文件对话框?


104

我有一个简单的脚本,可以解析文件并将其内容加载到数据库中。我不需要用户界面,但是现在我提示用户使用raw_input最不友好的文件进行解析,尤其是因为用户无法复制/粘贴路径。我想要一种快速简便的方法来向用户显示文件选择对话框,他们可以选择文件,然后将其加载到数据库中。(在我的用例中,如果他们碰巧选择了错误的文件,它将无法解析,即使将其加载到数据库中也不会有问题。)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

这段代码接近我想要的代码,但是却留下了一个烦人的空框架(无法关闭,可能是因为我尚未注册close事件处理程序)。

我不必使用tkInter,但是因为它在Python标准库中,所以它是最快,最简单解决方案的理想选择。

在没有任何其他UI的情况下,在脚本中提示文件或文件名的快捷简便方法是什么?


较小的更正:您可以通过右键单击文本区域并从上下文菜单中选择“粘贴”,将其粘贴到终端(听起来像是在Windows上)。
Deestan '02

1
Python raw_input提示中没有右键单击菜单。
Buttons840 2012年

2
raw_input在具有右键菜单的终端中进行。
Deestan

Answers:


200

如果您不希望有任何其他依赖项,则Tkinter是最简单的方法。要仅显示不包含任何其他GUI元素的对话框,必须使用以下withdraw方法隐藏根窗口:

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

Python 2变体:

import Tkinter, tkFileDialog

root = Tkinter.Tk()
root.withdraw()

file_path = tkFileDialog.askopenfilename()

3
这应该是公认的答案。它简单,有效,只要您不一遍又一遍地创建新的Tk根窗口,就可以了(更不用说这正是我遇到此线程时一直在寻找的答案)。
安德鲁

2
我也将其用于我的工作。它在Fedora上可以正常工作,但是在Ubuntu上,它会使后面的所有matplotlib数字混乱。pylab.show()挂起后差不多了。我仍然可以在终端中输入内容,但没有任何反应。对于我的程序,cpu也将变为0%。有什么建议吗?
戴安娜(Diana)2013年

17
在python3上:tkinter.filedialog.askopenfilename()
jfs

10
在python2上:import Tkinter as tkimport tkFileDialogfile_path = tkFileDialog.askopenfilename()
SaschaH

8
这在MacOS上无法正常工作:对话框打开但变得无响应,整个脚本挂起。
定期维护

26

您可以使用easygui

import easygui

path = easygui.fileopenbox()

要安装easygui,您可以使用pip

pip3 install easygui

它是一个单纯Python模块(easygui.py),其用途tkinter


6
easygui项目已关闭,暂未做进一步维护-在Python 3.5上运行时,当前会引发错误/异常,请考虑其他选择
pepe 2016年

2
@pepe:我在项目存储库中没有看到任何通知(最新提交是5月15日)
jfs

知道,谢谢,也许有人捡了它:请参阅easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2
pepe

@Zanam显然可以正常工作。但是可能会有错误
jfs

如果您在使用tkinter + matplotlib组合时遇到麻烦,则可以节省您的时间!
Cuong Truong Huy

20

尝试使用wxPython

import wx

def get_path(wildcard):
    app = wx.App(None)
    style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
    dialog = wx.FileDialog(None, 'Open', wildcard=wildcard, style=style)
    if dialog.ShowModal() == wx.ID_OK:
        path = dialog.GetPath()
    else:
        path = None
    dialog.Destroy()
    return path

print get_path('*.txt')

5

如果不需要UI或希望程序在CLI中运行,则可以将文件路径解析为参数。这将使您可以使用CLI的自动完成功能来快速查找所需的文件。

如果脚本除了文件路径输入之外是非交互式的,这可能仅是方便的。


这是一个有效的解决方案,尽管每次必须使用Windows命令行时,我都会为自己内心感到难过。我在Windows环境中。
Buttons840 2012年

2
我懂了。与Unix相比,Windows中的CLI非常糟糕。我明白了为什么文件选择器会很整洁。我想也许将文件拖放到脚本上,然后读取文件名作为参数?(mindlesstechnology.wordpress.com/2008/03/29/…)如果不涉及首先物理复制文件,这将使其更加容易。我不在Windows Box自动柜员机上,所以我无法测试其行为。如果您需要在.reg文件中安装注册表黑客,则可以轻松地对其进行部署。
SQDK '02

或者,您可以让.bat文件将文件名作为参数传递给脚本。这不涉及任何注册表黑客。
SQDK


1

pywin32提供对GetOpenFileNamewin32函数的访问。从例子

import win32gui, win32con, os

filter='Python Scripts\0*.py;*.pyw;*.pys\0Text files\0*.txt\0'
customfilter='Other file types\0*.*\0'
fname, customfilter, flags=win32gui.GetOpenFileNameW(
    InitialDir=os.environ['temp'],
    Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_EXPLORER,
    File='somefilename', DefExt='py',
    Title='GetOpenFileNameW',
    Filter=filter,
    CustomFilter=customfilter,
    FilterIndex=0)

print 'open file names:', repr(fname)
print 'filter used:', repr(customfilter)
print 'Flags:', flags
for k,v in win32con.__dict__.items():
    if k.startswith('OFN_') and flags & v:
        print '\t'+k

1

使用tkinter(python 2)或Tkinter(python 3),确实可以显示文件打开对话框(请参见此处的其他答案)。但是请注意,该对话框的用户界面已过时,并且与Windows 10中可用的较新文件打开对话框不对应。

此外,如果您正在寻找将python支持嵌入到自己的应用程序中的方法,您很快就会发现tkinter库不是开放源代码,甚至更多—它是商业库。

(例如,搜索“ activetcl定价”将带您到此网页:https ://reviews.financesonline.com/p/activetcl/ )

因此,tkinter库将为要嵌入python的任何应用程序花费资金。

我自己设法找到pythonnet库:

(麻省理工学院执照)

使用以下命令可以安装pythonnet:

pip3 install pythonnet

在这里,您可以找到使用打开文件对话框的工作示例:

https://stackoverflow.com/a/50446803/2338477

让我在这里也复制一个示例:

import sys
import ctypes
co_initialize = ctypes.windll.ole32.CoInitialize
#   Force STA mode
co_initialize(None)

import clr 

clr.AddReference('System.Windows.Forms')

from System.Windows.Forms import OpenFileDialog

file_dialog = OpenFileDialog()
ret = file_dialog.ShowDialog()
if ret != 1:
    print("Cancelled")
    sys.exit()

print(file_dialog.FileName)

如果您还错过了更复杂的用户界面,请参阅pythonnet git中的Demo文件夹。

我不确定是否可以移植到其他操作系统,但是没有尝试过,但是计划将.net 5移植到多个操作系统(搜索“ .net 5平台”,https://devblogs.microsoft.com/dotnet/introducing -net-5 /)-因此该技术也可以用于未来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.