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

2025-01-17 09:22:00
admin
原创
116
摘要:问题描述:我有一个简单的脚本,它可以解析文件并将其内容加载到数据库中。我不需要用户界面,但现在我提示用户使用raw_input最不友好的方式解析文件,尤其是因为用户无法复制/粘贴路径。我想要一种快速简便的方法向用户显示文件选择对话框,他们可以选择文件,然后将其加载到数据库中。(在我的用例中,如果他们碰巧选择了...

问题描述:

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

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

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

我不必使用 tkInter,但由于它位于 Python 标准库中,因此它是最快捷、最简单的解决方案的理想选择。

有什么快速简便的方法来在脚本中提示输入文件或文件名而无需任何其他 UI?


解决方案 1:

如果您不想有任何其他依赖项,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()

解决方案 2:

您可以使用easygui:

import easygui

path = easygui.fileopenbox()

要安装easygui,您可以使用pip

pip3 install easygui

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

解决方案 3:

尝试使用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')

解决方案 4:

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

import win32gui, win32con, os

file_types = "Python Scripts*.py;*.pyw;*.pysText files*.txt"
customfilter = "Other file types*.*"
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("    " + k)

解决方案 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

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

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/) - 所以这项技术也是面向未来的。

解决方案 6:

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

这可能仅当脚本除了文件路径输入之外都是非交互式的时才会很方便。

解决方案 7:

另一个与操作系统无关的选项是使用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())

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

解决方案 8:

我刚刚偶然发现了这个仅适用于 Windows 的小技巧:从子进程运行 powershell.exe。

import subprocess

sys_const = ssfDESKTOP # Starts at the top level
# sys_const = 0x2a # Correct value for "Program Files (0x86)" folder
powershell_browse = "(new-object -COM 'Shell.Application')."
powershell_browse += "BrowseForFolder(0,'window title here',0,sys_const).self.path"

ret = subprocess.run(["powershell.exe",powershell_browse], stdout=subprocess.PIPE)
print(ret.stdout.decode())

请注意系统文件夹常量的可选使用。(shldisp.h 中有一个模糊的拼写错误,即“Program Files (0x86)”常量分配错误。我添加了一条注释,其中包含正确的值。我花了一点时间才弄清楚。)

更多信息如下:

系统文件夹常量

解决方案 9:

使用 tkinter 的可接受答案运行得很好,但我发现文件对话框在 Linux 上看起来不太好。此外,当我从 flask 启动 tkinter 时遇到了问题(我收到“RuntimeError:主线程不在主循环中”)。所以我创建了一个名为 filedialpy 的小包,它可以打开本机文件对话框:https ://github.com/e-sollier/filedialpy 。它适用于 Linux、Windows 和 Mac。基本用法:

import filedialpy

f=filedialpy.openFile() 

解决方案 10:

如果您不想安装上面提到的任何模块,您可以使用开箱即用的子进程模块通过 PowerShell 完成此操作,如下所示:

import subprocess

PS_Commands = "Add-Type -AssemblyName System.Windows.Forms;"
PS_Commands += "$fileBrowser = New-Object System.Windows.Forms.OpenFileDialog;"
PS_Commands += "$Null = $fileBrowser.ShowDialog();"
PS_Commands += "echo $fileBrowser.FileName"
file_path = subprocess.run(["powershell.exe", PS_Commands], stdout=subprocess.PIPE)
file_path = file_path.stdout.decode()
file_path = file_path.rstrip()
print(file_path)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用