Python操作文件对话框——wxPython
前段时间学习操作excel的时候就想找一个操作文件对话框的方法,网上搜了很多都是借助tinker打开的,这种方式我感觉运行稍稍有些慢了,而且会有一个额外的root窗口,当然可以关闭,但比较繁琐。涉及到多文件选择的情况也没办法去处理。
今天在看wxpython模块,发现也有文件对话框操作,而且比较简洁好用,所以在这里记录一下。
依赖:
pip install wxpython
1、创建app和frame对象
app = wx.App()
frame = wx.Frame(None, title="", pos=(0, 0), size=(100, 100))
这一步只是因为wx.FileDialog方法需要基于父容器对象创建,这里我选择创建一个frame,这里的pos、size等参数设置什么值都可以,主要是创建这样一个对象。不会存在多余的窗口。
注意:app对象必须先创建且必须有变量接受,不然会出现下面的错误。
wx._core.PyNoAppError: The wx.App object must be created first!
2、创建文件对话框
dlg = wx.FileDialog(parent=frame, message="多文件选择",
defaultDir=os.getcwd(),
style=wx.FD_MULTIPLE,
wildcard="All files*.*|*.*")
参数说明:
- parent:父容器,这里使用上面创建的frame
- message:对话框标题
- defaultDir:默认目录
- defaultFile:默认文件
- wildcard:文件过滤器, 格式其实很简单 “显示名称|匹配类型”为一组,设置多组时继续用 | 隔开就好。
- style:文件对话框类型
类型 | 说明 |
wx.FD_OPEN | 文件选择对话框,用于单文件选择 |
wx.FD_MULTIPLE | 文件选择对话框,用于多文件选择 |
wx.FD_CHANGE_DIR | 文件选择对话框,用户选择文件后会改变默认目录 |
wx.FD_SAVE | 文件保存对话框,用于多文件选择 |
wx.FD_OVERWRITE_PROMPT | 搭配文件保存对话框使用,文件已存在时会提示覆盖 |
wx.FD_OVERWRITE_PROMPT例: wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
3、显示对话框,获取选择的文件
if dlg.ShowModal() == wx.ID_OK:
filename = dlg.GetPaths()
print(filename)
dlg.Destroy()
注意:dlg.GetPaths方法只能在wx.FD_MULTIPLE类型时才能使用,单文件选择需要使用dlg.GetPath方法。
其实已经有了很多wxpython文件操作的博客,但是大部分都是基于集成wx.frame来操作的,当我们只需要选择文件获取路径时,像我这样操作就已经可以了。
完整代码:
import os
import wx
app = wx.App()
def openFileDialog(style=wx.FD_OPEN, message="选择文件", defaultDir=os.getcwd(), wildcard="All files(*.*)|*.*"):
frame = wx.Frame(None, title="", pos=(0, 0), size=(100, 100))
dlg = wx.FileDialog(parent=frame, message=message,
defaultDir=defaultDir,
style=style,
wildcard=wildcard)
if dlg.ShowModal() == wx.ID_OK:
if style == wx.FD_MULTIPLE:
return dlg.GetPaths()
return dlg.GetPath()
dlg.Destroy()
return None
print(openFileDialog(wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT))
我这里稍微封装了一下,返回选择的路径。
欢迎大家留言探讨。