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

But*_*840 91 python openfiledialog

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

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()
Run Code Online (Sandbox Code Playgroud)

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

我不必使用tkInter,但由于它在Python标准库中,因此它是最快和最简单的解决方案的良好候选者.

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

tom*_*odi 170

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

import tkinter as tk
from tkinter import filedialog

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

file_path = filedialog.askopenfilename()
Run Code Online (Sandbox Code Playgroud)

Python 2变种:

import Tkinter, tkFileDialog

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

file_path = tkFileDialog.askopenfilename()
Run Code Online (Sandbox Code Playgroud)

  • 在python3上:`tkinter.filedialog.askopenfilename()` (17认同)
  • 在python2上:`import Tkinter as tk`和`import tkFileDialog`和`file_path = tkFileDialog.askopenfilename()` (10认同)
  • 这在MacOS上运行不正常:对话框打开但无响应,整个脚本挂起. (7认同)
  • 这应该是公认的答案.它简单,有效,只要你不是一遍又一遍地创建新的Tk根窗口,它就没问题了(更不用说它正是我遇到这个线程时我正在寻找的答案). (3认同)
  • 我也把它用于我的工作.它在Fedora上工作正常,但在Ubuntu上它会弄乱随后的任何matplotlib数字.几乎在pylab.show()之后它就会挂起.我仍然可以输入终端,但没有任何反应.对于我的程序,cpu也是0%.有什么建议? (2认同)

jfs*_*jfs 21

你可以使用easygui:

import easygui

path = easygui.fileopenbox()
Run Code Online (Sandbox Code Playgroud)

要安装easygui,您可以使用pip:

pip3 install easygui
Run Code Online (Sandbox Code Playgroud)

它是一个使用的单个纯Python模块(easygui.py)tkinter.

  • easygui项目已经关闭,没有进一步维护 - 它在Python 3.5上运行时当前抛出错误/异常,或许考虑其他选项 (4认同)
  • @pepe:我在[项目存储库](https://github.com/robertlugg/easygui)中没有看到任何通知(最新提交是5月15日) (2认同)

Fog*_*ird 16

尝试使用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')
Run Code Online (Sandbox Code Playgroud)


Kev*_*yth 10

pywin32提供对 win32 函数的访问GetOpenFileName。从例子来看

import win32gui, win32con, os

file_types = "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=file_types,
    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)
Run Code Online (Sandbox Code Playgroud)

  • @Mooncrater 将 `|win32con.OFN_NOCHANGEDIR` 添加到 `Flags`,但要注意警告 /sf/ask/3532763601/西迪亚 (2认同)

SQD*_*QDK 6

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

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

  • 我知道了。与 Unix 相比,Windows 中的 CLI 非常糟糕。我明白为什么文件选择器会很整洁。我想也许可以将文件拖放到脚本上,然后读取文件名作为参数?(http://mindlesstechnology.wordpress.com/2008/03/29/make-python-scripts-droppable-in-windows/) 如果它不首先涉及物理复制文件,那会更容易。我不在 Windows 盒式 ATM 上,所以我无法测试它的行为。如果您需要在多台机器上安装它,您可以轻松地在 .reg 文件中部署注册表黑客。 (2认同)

Tar*_*aro 5

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

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

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

因此,对于任何想要嵌入 Python 的应用程序,tkinter 库都需要花钱。

我自己设法找到了 pythonnet 库:

(麻省理工学院许可证)

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

pip3 install pythonnet
Run Code Online (Sandbox Code Playgroud)

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

/sf/answers/3531276241/

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

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)
Run Code Online (Sandbox Code Playgroud)

如果您还想念更复杂的用户界面 - 请参阅演示pythonnet git 中的文件夹。

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


Dae*_*mon 5

另一个与操作系统无关的选项,使用pywebview

import webview

def webview_file_dialog():
    file = None
    def open_file_dialog(w):
        nonlocal file
        try:
            file = w.create_file_dialog(webview.OPEN_DIALOG)[0]
        except TypeError:
            pass  # user exited file dialog without picking
        finally:
            w.destroy()
    window = webview.create_window("", hidden=True)
    webview.start(open_file_dialog, window)
    # file will either be a string or None
    return file

print(webview_file_dialog())

Run Code Online (Sandbox Code Playgroud)

环境:Mac 上的 python3.8.6 - 尽管我之前在 Windows 10 上使用过 pywebview。