百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

wxPython - 文件选择对话框FileDialog

suiw9 2024-10-23 18:45 92 浏览 0 评论

实战wxPython系列-017

文件选择对话框通常在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:改变当前工作目录为用户选择的文件夹。

二、使用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来进行多文件选择。

四、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 - About对话框

相关推荐

俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)

发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...

如何强制所有流量使用 HTTPS一网上用户

如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...

https和http的区别(https和http有何区别)

“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...

快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别

什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...

简述HTTPS工作原理(简述https原理,以及与http的区别)

https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...

21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)

HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...

一次安全可靠的通信——HTTPS原理

为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...

为什么有的网站没有使用https(为什么有的网站点不开)

有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

图解HTTPS「转」(图解http 完整版 彩色版 pdf)

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...

HTTP 和 HTTPS 有何不同?一文带你全面了解

随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...

HTTP与HTTPS的区别,详细介绍(http与https有什么区别)

HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...

一文让你轻松掌握 HTTPS(https详解)

一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...

如何在Spring Boot应用程序上启用HTTPS?

HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...

一文彻底搞明白Http以及Https(http0)

早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...

取消回复欢迎 发表评论: