在wxPython中,不仅提供了文件选择对话框wx.FileDialog,类似的,它还提供了一个用于选择文件夹的对话框wx.DirDialog , 通过使用wx.DirDialog,我们可以方便地实现选择一个或者多个文件的功能。
一、了解wx.DirDialog
wx.DirDialog提供一个目录选择对话框。
它支持如下窗口样式(参数style设置):
- wx.DD_DEFAULT_STYLE: 等价于wx.DEFAULT_DIALOG_STYLE和wx.RESIZE_BORDER的组合;
- wx.DD_DIR_MUST_EXIST: 在这种样式下,对话框将允许用户选择一个现有的文件夹, 当参数中没有设置这种样式时,将在对话框中添加”创建新目录”按钮(在Windows上)或者提供其他方式让用户输入新文件夹的名称;
- wx.DD_CHANGE_DIR: 将当前工作目录更改为用户选择的目录。该标志不能与wx.DD_MULTIPLE 一起使用;
- wx.DD_MULTIPLE: 允许用户选择多个目录。该标志仅在wxWidgtes 3.1.4之后的版本才可用。
- wx.DD_SHOW_HIDDEN: 显示隐藏文件夹和系统文件夹。该标志仅在wxWidgtes 3.1.4之后的版本才可用。
注意:RESIZE_BORDER在Windows下有新旧两种不同的目录选择对话框可以使用,旧版本中的对话框大小是固定的,RESIZE_BORDER隐式地选择新版本的对话框。在通常情况下新版本更符合程序要求,除非需要显式地在Window下使用旧的对话框版本,建议始终使用RESIZE_BORDER样式来创建对话框。
dlg = wx.DirDialog (None, "Choose input directory", "", wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST)
而不是仅仅使用DD_DIR_MUST_EXIST样式。
图1:wx.DirDialog类继承关系
二、使用wx.DirDialog
Wx.DirDialog的常用方法有:
- GetMessage(self): 返回文件对话框的标题信息;
- GetPath(self): 返回缺省或者用户选择的文件夹,本方法不同用于带有 样式DD_MULTIPLE的窗口中;
- GetPaths(self, paths): 将选择的文件的全部路径填充到参数paths中;
- SetMessage(self, message): 设置对话框的标题信息;
- SetPath(self, path): 设置默认选择的文件路径;
- ShowModal(self): 显示对话框,如果点击了wx.OK按钮则返回wx.ID_OK,否则返回wx.ID_CANCEL。
三、wx.DirDialog演示
类似wx.FileDialog中的演示样例,下面的例子演示了如何使用wx.DirDialog,代码如下:
#目录选择对话框(DirDialog)
import wx
import os
class SampleDirDialog(wx.Frame):
def __init__(self, *args, **kw):
super(SampleDirDialog, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: 文件夹选择对话框")
#设置窗口尺寸
self.SetSize(480, 360)
#设置窗口位置
self.SetPosition(wx.DefaultPosition)
#设置窗口样式
self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE)
#创建菜单栏
self.BuildMenuBar()
self.Centre()
#===== 显示选中的文件夹名 =====#
label = wx.StaticText(self, -1, "当前选择的文件夹:")
self.txtBox = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE, size = (-1, 300))
#水平布局
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(label, 0, wx.ALL|wx.ALIGN_TOP)
sizer.Add(self.txtBox, 1, wx.ALL|wx.ALIGN_CENTER)
#向窗口中添加布局
self.SetSizer(sizer)
def BuildMenuBar(self):
mainMenuBar = wx.MenuBar()
fileMenu = wx.Menu()
dirBrowserItem = fileMenu.Append(-1, "文件夹浏览")
self.Bind(wx.EVT_MENU, self.OnDirBrowser, dirBrowserItem)
projectSaveAsItem = fileMenu.Append(-1, "项目另存为")
self.Bind(wx.EVT_MENU, self.OnSaveProjectAs, projectSaveAsItem)
newProjectItem = fileMenu.Append(-1, "新建项目")
self.Bind(wx.EVT_MENU, self.OnNewProject, newProjectItem)
mainMenuBar.Append(fileMenu, title="&文件")
self.SetMenuBar(mainMenuBar)
def OnDirBrowser(self, e):
dlg = wx.DirDialog(self,message="选择一个文件夹", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
else:
path = ""
dlg.Destroy()
self.txtBox.SetLabel(path)
def OnNewProject(self, e):
if wx.Platform == "__WXMSW__":
path = os.getenv("USERPROFILE")
else:
path = os.getenv("HOME")
dlg = wx.DirDialog(self, "选择一个项目", path, wx.DD_NEW_DIR_BUTTON)
ret = dlg.ShowModal()
if ret == wx.ID_OK:
prjPath = dlg.GetPath()
if os.path.isdir(prjPath) and len(os.listdir(prjPath)) == 0:
self.txtBox.SetLabel(prjPath)
dlg.Destroy()
def OnSaveProjectAs(self, e):
if wx.Platform == "__WXMSW__":
path = os.getenv("USERPROFILE")
else:
path = os.getenv("HOME")
dlg = wx.DirDialog(self, "选择一个目录来保存项目", path, wx.DD_NEW_DIR_BUTTON)
ret = dlg.ShowModal()
if ret == wx.ID_OK:
newPrjPath = dlg.GetPath()
self.txtBox.SetLabel(newPrjPath)
dlg.Destroy()
def main():
app = wx.App()
sample = SampleDirDialog(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
在上面的样例中,分别演示了使用wx.DirDialog浏览文件夹,以及模拟保存一个工程和新建一个工程所需要打开或者新建一个文件夹。可以复制上面的代码,保存为文件dir_dialog.py,运行该文件,然后测试运行效果。
图2: wx.DirDialog演示
四、wx.DirSelector
调用wx.DirSelector全局方法,可以弹出一个目录选择对话框,该方法的原型为:
wx.DirSelector(message, defaultPath, style, pos,parent)
参数:
message: 文件选择器的标题。
defautPath: 默认路径,默认为空白。
style:对话框风格,参见wx.DirDialog,缺默认值为0。
pos:对话框位置,默认值为wx.DefaultPosition。
parent: 父窗口,默认值为空。
调用方法:
dir = wx.DirSelector("选择一个文件夹")
将打开一个目录选择对话框。
五、本文知识点
- 了解wx.DirDialog的基本功能和常用方法。
- 使用wx.DirDialog目录选择对话框进行目录选择交互。
- 调用wx.DirSelector全局方法。