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

文件选择对话框通常在GUI程序用来选择一个或者多个文件,Window系统中提供基本的API来创建一个通用的文件的选择对话框,类似的,在PyQt/PySide,wxPython等Python GUI程序开发包中,也提供了类似的文件选择对话框,在wxPython中,实现文件选择对话框的类为wx.FileDialog。

一、wx.FileDialog简介

wx.FileDialog构造函数支持设置文件的缺省路径, 参数defaultDir指定要选择的文件所在的缺省文件夹,如果该参数为空白,则目录为当前文件夹;参数defaultFile为默认文件,如果该参数为空白,则不提供默认文件;参数wardcard为匹配通配符,wx.FileDialog允许用户选择一个或者多个文件,在使用通配符的情况下,可以让用户才只选择关心的文件。例如,"BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif"只会显示和选择图片后缀类型是bmp和gif 的文件;参数style则指定对话框的打开样式。这些样式包括:

  • wx.FD_OPEN: 单个文件选择对话框;
  • wx.FD_SAVE: 文件保存对话框;
  • wx. FD_OVERWRITE_PROMPT: 只对保存对话框有效,当覆盖文件的时候,会弹出提醒对话框;
  • wx.FD_MULTIPLE:只对打开对话框有效,支持选择多个文件;
  • wx.FD_CHANGE_DIR:改变当前工作目录为用户选择的文件夹。

 图1: wx.FileDialog类继承关系

二、使用wx.FileDialog

wx.FileDialog的常用方法有:

  • GetDirectory(self): 返回对话框默认的文件夹;
  • GetFilename(self): 返回对话框默认的文件名;
  • GetFilenames(self): 返回用户选择的文件列表;
  • GetFileIndex(self): 返回通配符参数中提供的默认筛列表的索引(可选);
  • GetMessage(self): 返回文件对话框的标题信息;
  • GetPath(self): 返回选择的文件的全路径(包括文件路径和文件名);
  • GetPaths(self): 在多选情况下,返回用户选择的文件全路径列表;
  • GetWildcard(self): 返回通配符;
  • SetDirectory(self, dir): 设置对话框默认的文件目录;SetFileName(self, name): 设置对话框默认的文件名;
  • SetFilterIndex(self, filterIndex): 设置默认筛选器索引,从0开始;
  • SetMessage(self, message): 设置对话框的标题信息;
  • SetPath(self, path): 设置默认选择的文件全路径名;
  • SetWildCard(self, wildcard): 设置对话框文件类型通配符;
  • ShowModal(self): 显示对话框,如果点击了wx.OK按钮则返回wx.ID_OK,否则返回wx.ID_CANCEL。

打开文件对话框的典型用法如下:

def OnOpen(self, event):

    if self.contentNotSaved:
        if wx.MessageBox("Current content has not been saved! Proceed?", "Please confirm",
                         wx.ICON_QUESTION | wx.YES_NO, self) == wx.NO:
            return

    # otherwise ask the user what new file to open
    with wx.FileDialog(self, "Open XYZ file", wildcard="XYZ files (*.xyz)|*.xyz",
                       style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:

        if fileDialog.ShowModal() == wx.ID_CANCEL:
            return     # the user changed their mind

        # Proceed loading the file chosen by the user
        pathname = fileDialog.GetPath()
        try:
            with open(pathname, 'r') as file:
                self.doLoadDataOrWhatever(file)
        except IOError:
            wx.LogError("Cannot open file '%s'." % newfile)

保存文件对话框的典型用法则更简单:

def OnSaveAs(self, event):

    with wx.FileDialog(self, "Save XYZ file", wildcard="XYZ files (*.xyz)|*.xyz",
                       style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:

        if fileDialog.ShowModal() == wx.ID_CANCEL:
            return     # the user changed their mind

        # save the current contents in the file
        pathname = fileDialog.GetPath()
        try:
            with open(pathname, 'w') as file:
                self.doSaveData(file)
        except IOError:
            wx.LogError("Cannot save current data in file '%s'." % pathname)

三、wx.FileDialog示例

下面的代码演示如何使用wx.FileDialog:

#文件选择对话框(FileDialog)

import wx

class SampleFileDialog(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleFileDialog, 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.CreateStatusBar()
        #创建菜单栏
        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.SetSizerAndFit(sizer)
        self.SetSizer(sizer)

    def BuildMenuBar(self):
        mainMenuBar = wx.MenuBar()

        fileMenu = wx.Menu()

        openMenuItem = fileMenu.Append(-1, "打开单个文件")
        self.Bind(wx.EVT_MENU, self.OpenSingleFile, openMenuItem)

        saveMenuItem = fileMenu.Append(-1, "保存文件")
        self.Bind(wx.EVT_MENU, self.SaveFile, saveMenuItem)

        savePromptMenuItem = fileMenu.Append(-1, "保存文件及提示覆盖")
        self.Bind(wx.EVT_MENU, self.SavePromptFile, savePromptMenuItem)

        multipleOpenMenuItem = fileMenu.Append(-1,"多文件选择")
        self.Bind(wx.EVT_MENU, self.MultipleSelectFiles, multipleOpenMenuItem)

        mainMenuBar.Append(fileMenu, title="&文件")

        self.SetMenuBar(mainMenuBar)

    ## wx.FileDialog style: wx.FD_OPEN
    def OpenSingleFile(self, e):
        fileFilter = "Image Files (*.bmp)|*.bmp|" "All files (*.*)|*.*"
        fileDialog =wx.FileDialog(self, message="选择单个文件", wildcard=fileFilter, style=wx.FD_OPEN)
        dialogResult = fileDialog.ShowModal()
        if dialogResult != wx.ID_OK:
            return
        path = fileDialog.GetPath()
        self.txtBox.SetLabel(path)

    ## wx.FileDialog style: wx.FD_SAVE
    def SaveFile(self, e):
        fileFilter = "Image Files (*.bmp)|*.bmp|" "All files (*.*)|*.*"
        fileDialog =wx.FileDialog(self, message="保存文件", wildcard=fileFilter, style=wx.FD_SAVE)
        dialogResult = fileDialog.ShowModal()
        if dialogResult != wx.ID_OK:
            return
        path = fileDialog.GetPath()
        self.txtBox.SetLabel(path)

    ## wx.FileDialog style: wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
    def SavePromptFile(self, e):
        fileFilter = "Image Files (*.bmp)|*.bmp|" "All files (*.*)|*.*"
        fileDialog =wx.FileDialog(self, message="保存&prompt文件", wildcard=fileFilter, style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
        dialogResult = fileDialog.ShowModal()
        if dialogResult != wx.ID_OK:
            return
        path = fileDialog.GetPath()
        self.txtBox.SetLabel(path)

    ## wx.FileDialog style: wx.FD_OPEN | wx.FD_MULTIPLE
    def MultipleSelectFiles(self, e):
        fileFilter = "Image Files (*.bmp)|*.bmp|" "All files (*.*)|*.*"
        fileDialog =wx.FileDialog(self, message="多文件选择", wildcard=fileFilter, style=wx.FD_OPEN|wx.FD_MULTIPLE)
        dialogResult = fileDialog.ShowModal()
        if dialogResult != wx.ID_OK:
            return
        paths = fileDialog.GetPaths()
        for path in paths:
            self.txtBox.AppendText(path + "\n")

def main():
    app = wx.App()
    sample = SampleFileDialog(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

在上面的示例中,我们创建一个主窗口,在主窗口中添加了四个菜单项,它们分别是:

  • 选择单个文件, 其窗口样式参数为wx.FD_OPEN, 它演示了如何使用wx.FileDialog来获得一个要打开的文件名;
  • 保存文件, 其窗口样式参数为wx.FA_SAVE, 它演示了如何使用wx.FileDialog来获得一个要保存的文件名;
  • 保存文件并提醒,其窗口样式参数为wx.FA_SAVE| wx. FD_OVERWRITE_PROMPT, 它演示了如何使用wx.FileDialog在保存文件时,如果文件已存在,则显示提示信息;
  • 多文件选择,其窗口样式参数为wx.FD_OPEN| wx.FD_MULTIPLE, 它演示了如何使用wx.FileDialog来进行多文件选择。

 图2:wx.FileDialog调用演示

四、wx.FileSelector

调用wx.FileSelector全局方法, 可以弹出一个文件选择对话框,该方法的原型为:

wx.FileSelector(message, defautPath, defaultFile, defaultExtension, wildcard, flags, parent, x, y)

参数:

message: 文件选择器的标题。

defautPath: 默认路径,缺省为空白。

defaultFile:默认文件名,缺省为空白。

defaultExtension:默认文件扩展名,缺省为空白。

wildcard:通配符,缺省为“*.*”。

parent:父窗口。

x:选择器水平显示位置。

y:选择器垂直显示位置。

调用方法:

filename = wx.FileSelector("打开一个JAVA文件", "", "", "js", "All files(*.*)|*.*|JavaScript Files(*.js)|*.js|Text Files(*.txt)|*.txt", wx.FD_OPEN, self)

打开一个文件选择对话框,并在关闭对话框后返回文件名。

五、本文知识点

  • 了解wx.FileDialog的基本功能和常用方法。
  • 使用wx.FileDialog文件选择对话框进行文件选择交互。
  • 调用调用wx.FileSelector全局方法。

前一篇:实战wxPython:016 - About对话框

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值