实战wxPython:018 - 文件夹选择对话框DirDialog

文章介绍了wxPython中的wx.DirDialog组件,用于创建目录选择对话框,支持多种样式如DD_DEFAULT_STYLE和DD_DIR_MUST_EXIST等。通过示例代码展示了如何使用wx.DirDialog进行文件夹选择,并提到了wx.DirSelector全局函数作为另一种选择目录的简便方式。

在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全局方法。

前一篇:实战wxPython:017 - 文件选择对话框FileDialog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值