使用简单的对话框选择 Python 中的文件

我希望在我的 Python 控制台应用中获得文件路径作为输入。

目前我只能要求在控制台中输入完整路径。

有没有一种方法可以触发一个简单的用户界面,用户可以选择文件,而不是键入完整的路径?

373917 次浏览

在 Python 2中使用 tkFileDialog模块。

import tkFileDialog


tkFileDialog.askopenfilename()

在 Python 3中使用 tkinter.filedialog模块。

import tkinter.filedialog


tkinter.filedialog.askopenfilename()

用 Tkinter 怎么样?

from Tkinter import Tk     # from tkinter import Tk for Python 3.x
from tkinter.filedialog import askopenfilename


Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

成交!

阿贵:

import easygui
print(easygui.fileopenbox())

安装:

pip install easygui

演示:

import easygui
easygui.egdemo()

Python 3.x 版本的 Etaoin 对完整性的回答:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()

另一个要考虑的选项是 Zenity: http://freecode.com/projects/zenity

我曾经有过这样一种情况: 我正在开发一个 Python 服务器应用程序(没有 GUI 组件) ,因此不想引入对任何 Python GUI 工具包的依赖,但是我希望我的一些调试脚本能够被输入文件参数化,并且如果用户没有在命令行上指定一个文件,我希望可视化地提示用户输入一个文件。Zenity 是个完美的选择。为此,使用子流程模块调用“ zenity —— file-select”并捕获标准输出。当然,这个解决方案不是特定于 Python 的。

Zenity 支持多个平台,并且恰好已经安装在我们的开发服务器上,因此它可以方便我们的调试/开发,而不会引入不必要的依赖关系。

我使用 wxPython 获得了比 tkinter 好得多的结果,正如对后面一个重复问题的回答中所建议的:

Https://stackoverflow.com/a/9319832

WxPython 版本产生的文件对话框看起来与我在 OpenSUSE Tumbleweed 上安装的 xfce 桌面上的任何其他应用程序中的打开文件对话框一样,而 tkinter 产生的是一些用不熟悉的侧面滚动界面难以阅读的东西。

这里有一个简单的函数,可以在终端窗口中显示文件选择器。 此方法支持选择多个文件或目录。即使在不支持 GUI 的环境中,这也有额外的好处。

from os.path import join,isdir
from pathlib import Path
from enquiries import choose,confirm


def dir_chooser(c_dir=getcwd(),selected_dirs=None,multiple=True) :
'''
This function shows a file chooser to select single or
multiple directories.
'''
selected_dirs = selected_dirs if selected_dirs else set([])


dirs = { item for item in listdir(c_dir) if isdir(join(c_dir, item)) }
dirs = { item for item in dirs if join(c_dir,item) not in selected_dirs and item[0] != "." } # Remove item[0] != "." if you want to show hidde


options = [ "Select This directory" ]
options.extend(dirs)
options.append("⬅")


info = f"You have selected : \n {','.join(selected_dirs)} \n" if len(selected_dirs) > 0 else "\n"
choise = choose(f"{info}You are in {c_dir}", options)


if choise == options[0] :
selected_dirs.add(c_dir)


if multiple and confirm("Do you want to select more folders?") :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)


return selected_dirs


if choise == options[-1] :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)


return get_folders(join(c_dir,choise),selected_dirs,multiple)

要安装查询器,

Pip 安装查询

这招对我很管用

参考资料: https://www.youtube.com/watch?v=H71ts4XxWYU

import  tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
print(file_path)

我解决了所有与... 有关的问题 from tkinter import * from tkinter import filedialog

只要从 魅惑术 IDE 迁移到 视觉工作室代码 IDE,所有问题就都解决了。

建议的 root.withdraw()(也是 给你)隐藏窗口而不是删除它,并且在 VS Code 中使用交互式控制台时造成了问题(“重复执行”错误)。

下面两个代码片段可以返回“打开”或“另存为”(Windows 上的 python3)中的文件路径:

import tkinter as tk
from tkinter import filedialog


filetypes = (
('Text files', '*.TXT'),
('All files', '*.*'),
)


# open-file dialog
root = tk.Tk()
filename = tk.filedialog.askopenfilename(
title='Select a file...',
filetypes=filetypes,
)
root.destroy()
print(filename)


# save-as dialog
root = tk.Tk()
filename = tk.filedialog.asksaveasfilename(
title='Save as...',
filetypes=filetypes,
defaultextension='.txt'
)
root.destroy()
print(filename)
# filename == 'path/to/myfilename.txt' if you type 'myfilename'
# filename == 'path/to/myfilename.abc' if you type 'myfilename.abc'

使用 播放器,您可以在 Windows、 macOS、 Linux 甚至 Android 上获得一个本地文件选择器。

import plyer


plyer.filechooser.open_file()

还有另外两种方法,choose_dirsave_file