Python中快速简单的文件对话框?

Python中快速简单的文件对话框?,python,openfiledialog,Python,Openfiledialog,我有一个简单的脚本,它解析文件并将其内容加载到数据库。我不需要UI,但现在我正在提示用户使用raw\u input解析文件,这非常不友好,尤其是因为用户无法复制/粘贴路径。我想用一种简单快捷的方式向用户展示一个文件选择对话框,用户可以选择文件,然后将其加载到数据库中。(在我的用例中,如果他们选择了错误的文件,解析就会失败,即使加载到数据库中也不会有问题。) 这段代码接近我想要的,但它留下了一个恼人的空框架(无法关闭,可能是因为我没有注册关闭事件处理程序) 我不必使用tkInter,但因为它在Py

我有一个简单的脚本,它解析文件并将其内容加载到数据库。我不需要UI,但现在我正在提示用户使用
raw\u input
解析文件,这非常不友好,尤其是因为用户无法复制/粘贴路径。我想用一种简单快捷的方式向用户展示一个文件选择对话框,用户可以选择文件,然后将其加载到数据库中。(在我的用例中,如果他们选择了错误的文件,解析就会失败,即使加载到数据库中也不会有问题。)

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

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


在没有任何其他UI的脚本中提示输入文件或文件名的快捷方法是什么?

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

这可能只有在脚本除了文件路径输入之外是非交互式的情况下才有用。

您可以使用:

要安装,您可以使用
pip

pip3 install easygui
它是一个纯Python模块(
easygui.py
),使用
tkinter

尝试:


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

Python 2变体:

import Tkinter, tkFileDialog

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

file_path = tkFileDialog.askopenfilename()

pywin32
提供对
GetOpenFileName
win32函数的访问。从

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

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

(例如,搜索“activetcl定价”将引导您进入此网页:)

所以tkinter库对于任何想要嵌入python的应用程序都要花钱

我自己设法找到了毕通尼图书馆:

  • 概述如下:
  • 源代码如下:
(麻省理工学院许可证)

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

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

让我在此复制一个示例:

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)
如果您还错过了更复杂的用户界面-请参阅文件夹 用蟒蛇git



我不确定是否可以移植到其他操作系统,也没有尝试过,但.net 5计划移植到多个操作系统(搜索.net 5平台),因此这项技术也是未来的证明。

这是一个有效的解决方案,尽管每次我不得不使用Windows命令行时,我内心都感到难过。我在Windows环境中。我明白了。与Unix相比,Windows中的CLI非常糟糕。我明白为什么文件选择器会很整洁。我猜可能是将文件拖放到脚本上,然后读取文件名作为参数?()如果不首先物理地复制文件,那么这将使它变得更容易。我不在Windows box ATM机上,因此无法测试其性能。如果需要在多台计算机上安装注册表黑客,可以在.reg文件中轻松部署它。或者,可以让.bat文件将文件名作为参数传递给脚本。这不涉及任何注册表黑客。这应该是公认的答案。它简单、有效,只要你不是一次又一次地创建新的Tk根窗口,就可以了(更不用说这正是我遇到这个线程时所寻找的答案)。我也只是在工作中使用了它。它在Fedora上运行良好,但在Ubuntu上,它会弄乱后面的matplotlib图形。差不多在pylab.show()之后它就挂了。我仍然可以在终端上打字,但什么也没发生。我的程序的cpu也变为0%。有什么建议吗?关于python3:
tkinter.filedialog.askopenfilename()
关于python2:
import tkinter as tk
import tkFileDialog
file\u path=tkFileDialog.askopenfilename()
这在MacOS上不起作用:对话框打开但没有响应,整个脚本挂起。easygui项目已经关闭,没有进一步维护——它在Python 3.5上运行时抛出错误/异常,可能考虑其他options@pepe:我在(最新提交日期为5月15日)中没有看到任何通知。很高兴知道,thx,也许有人捡到了它:see@Zanam显然它确实有效。但也有可能。如果你们在tkinter+matplotlib组合中遇到问题,它可以帮你们节省时间!这将我当前的工作目录更改为从中拾取文件的目录。在这种情况下该怎么办?@mooncarter将
|win32con.OFN_NOCHANGEDIR
添加到
标志
,但要注意警告嘿,谢谢你的建议。每次使用
GetOpenFileNameW
时,我最终都会恢复到原始目录。此解决方案仅适用于Windows。在linux.NET上安装。o仅使用python中的FileOpen对话框?好笑…还没试过。python.net需要移植到.NETCore,之后还需要打开文件对话框。不确定什么时候会发生。需要尝试一下当前的技术。
import tkinter as tk
from tkinter import filedialog

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

file_path = filedialog.askopenfilename()
import Tkinter, tkFileDialog

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

file_path = tkFileDialog.askopenfilename()
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
pip3 install pythonnet
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)