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

时间:2012-02-16 21:24:41

标签: python openfiledialog

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

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

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

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

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

9 个答案:

答案 0 :(得分:150)

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

答案 1 :(得分:20)

您可以使用easygui

import easygui

path = easygui.fileopenbox()

要安装easygui,您可以使用pip

pip3 install easygui

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

答案 2 :(得分:15)

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

答案 3 :(得分:4)

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

如果脚本在文件路径输入之外是非交互式的,那么这可能只是方便。

答案 4 :(得分:2)

查看EasyGUI,一个非常易于使用的模块,可以完成这项工作 - http://easygui.sourceforge.net/

您可以使用fileopenbox函数 - http://www.ferg.org/easygui/easygui.html#-fileopenbox

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

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

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

我一个人设法找到pythonnet库:

(MIT许可)

使用以下命令可以安装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)

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

我不确定是否可以移植到其他操作系统,但尚未尝试将.net 5移植到多个操作系统(搜索“ .net 5平台”,https://devblogs.microsoft.com/dotnet/introducing-net-5/)-因此,这项技术也是未来的证明。

答案 7 :(得分:0)

Python 3.8 32位 使用FileDialog选择文件的简单方法

from tkinter import filedialog
import tkinter

root = tkinter.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()
print(file_path)

答案 8 :(得分:0)

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

相关问题