首页 > 编程语言 >手把手教你wxPython应用软件开发

手把手教你wxPython应用软件开发

时间:2023-02-04 17:33:06浏览次数:55  
标签:窗口 手把手 self 应用软件 wxPython Bind 数据 数据库 wx

wxPython是一款优秀的GUI(图形用户界面)开发框架,使用它可以开发出界面精美、功能强大的应用软件。

这里以开发一个图书管理系统为例,讲解wxPython开发应用软件的方法和技巧。

图书管理系统要实现的功能包括:连接Mysql数据库获取图书数据列表,实现图书信息数据的查看、插入、修改、删除,数据批量导入,以及根据书名关键字和出版社进行组合查询筛选的功能。

1.主窗口界面

主窗口是该软件与用户进行交互的入口,其核心是创建数据展现区、查询筛选功能区、增删改查功能区和批量导入功能区的版块布局,并从数据库获取图书信息数据。

窗口界面布局中,要用到的控件包括:​​wx.StaticText​​​(静态文本标签)、​​wx.TextCtrl​​​(文本框)、​​wx.ComboBox​​​(下拉列表)、​​wx.Button​​​(按钮)、​​wx.ListCtrl​​​(数据列表)、​​wx.FileDialog​​​(文件选择对话框)、​​wx.MessageDialog​​(消息对话框)。

软件运行主界面如下图:

手把手教你wxPython应用软件开发_图形用户界面

2.子窗口及功能

点击主窗口的功能按钮,会打开相应子窗口。我们使用​​self.mainframe = parent​​来声明mainframe为父窗口,也就是软件的主窗口界面,方便后面在子窗口的事件函数中操作父窗口中的数据列表。

以打开新增图书信息的窗口为例,下面代码表示了从主窗口打开子窗口的方法:

show_addFrame = AddFrame(self, "新增窗口")
show_addFrame.Show(True)

新增和编辑图书信息窗口:

手把手教你wxPython应用软件开发_图形用户界面_02

以删除图书记录为例,以下代码示意了从主窗口的数据列表框中选定一条记录,取得其ID值(数据列表框中索引为0的字段的值),作为参数传递给dbconn类中的函数deleteBook()执行删除操作。

selectRow = self.list.GetFirstSelected()
bookid=self.list.GetItem(selectRow, 0).Text
self.dbconn.deleteBook(bookid)

这里是前端界面向函数传入一个参数的情况,在执行新增、修改操作的后台函数中,会用到向数据库连接类中的函数传递多个参数的情况。示例如下:

self.dbconn.updateBook(self.bookname.GetValue(),self.author.GetValue(),self.price.GetValue(),self.publish.GetValue(),self.content.GetValue(),self.bookid)

传入的参数包含了书名、作者、价格、出版社、内容介绍和图书ID,相应地,在数据库连接类中的updateBook()函数的形式参数也与之一一对应。

程序在后台运行的过程中,用户需要了解程序执行的进度,可以通过消息框来向用户反馈操作的结果。

手把手教你wxPython应用软件开发_Python_03

3.界面与功能关联

笔者在另外一门关于Python Web开发框架Django的课程里讲过MVC开发架构,也就是前后端分离的开发模式,事实上,不仅是Web开发遵循这样一种思路,在基于C/S架构的软件开发过程中,也体现了这样的思想。在wxPython程序的主函数中定义界面中各个控件的属性,这是前端范畴;在各个事件函数中定义相应的功能,对数据库进行操作,这属于后端范畴。前后端各自完成自身的任务,并协同配合,实现整个软件的开发需求。

要让前端控件和后端事件紧密联系,就需要通过Bind()方法来绑定控件和事件函数,使得点击界面上的控件时,调用和执行对应函数中的代码,使用的方法是:

​self.Bind(wx.EVT_BUTTON, 函数名, 控件名)​

在本例中,将控件和事件函数绑定的核心代码如下:

self.Bind(wx.EVT_BUTTON, self.queryResult, query_btn)  
self.Bind(wx.EVT_BUTTON, self.showBook, view_btn)
self.Bind(wx.EVT_BUTTON, self.editBook, edit_btn)
self.Bind(wx.EVT_BUTTON, self.addNewBook, add_btn)
self.Bind(wx.EVT_BUTTON, self.deleteBook, del_btn)
self.Bind(wx.EVT_BUTTON, self.OnOpen, open_btn)
self.Bind(wx.EVT_BUTTON, self.toMysql, pldr_btn)

4.数据库连接类

创建应用程序到数据库的连接,实现不同场景下的数据表查询并返回相应结果。

  • getAllData():获取数据库中全部记录,不设定查询条件;
  • showPublish():获取全部出版社,同一个出版社只返回一个结果;
  • queryData():根据书名的关键字和所选的出版社组合查询满足条件的记录;
  • insertBook():将传入的各个字段值写入数据库;
  • updateBook():将数据库中ID值等于传入ID值的记录的各个字段值加以更新;
  • deleteBook():删除数据库中ID值等于传入ID值的记录;
  • viewData():根据传入的ID值查询满足条件的记录。

应用程序对数据库记录的操作,无外乎就是增、删、改、查这四种方法。批量导入是向数据库插入记录的特殊场景,就是将数据存储的方式由面向单条数据拓展为面向多条数据。

就数据存取的方向而言,可以分为数据读取和数据写入两种情况。写入数据时,在执行SQL语句之后,一定不要忘记执行下面这条命令:

conn.commit()

否则,不会将更改应用到数据库中。从这个意义上讲,这段文字可以算作一个避坑指南。

5.前后端数据的同步

对数据进行了增删改操作,要在两个层面加以体现。一是对数据库中的记录进行更新,另一层是在主窗口的数据列表框展现,这两个过程应该是同时执行。并且,除了在数据列表框中刷新记录(笔者称之为“显性刷新”)之外,还不要忘记在出版社下拉列表中,也要重新获取最新的出版社列表数据并自动刷新(笔者称之为“隐性刷新”),这样来确保数据的实时同步。

更多内容可以到 51CTO学堂 观看视频讲解:

​https://edu.51cto.com/course/33049.html​​​​​

标签:窗口,手把手,self,应用软件,wxPython,Bind,数据,数据库,wx
From: https://blog.51cto.com/u_15603903/6037209

相关文章

  • 手把手教大家写书写一个Mqtt网关
    摘要:物联网是现在比较热门的软件领域,众多物联网厂商都有自己的物联网平台,而物联网平台其中一个核心的模块就是Mqtt网关。本文分享自华为云社区《​​一文带你掌握物联网mqtt......
  • 手把手教大家写书写一个Mqtt网关
    摘要:物联网是现在比较热门的软件领域,众多物联网厂商都有自己的物联网平台,而物联网平台其中一个核心的模块就是Mqtt网关。本文分享自华为云社区《一文带你掌握物联网mqtt网......
  • 基于STM32使用HAL库手把手移植华为LiteOS系统并使用CMSIS接口API
    基于STM32使用HAL库手把手移植华为LiteOS系统并使用CMSIS接口API目录​​基于STM32使用HAL库手把手移植华为LiteOS系统并使用CMSIS接口API​​​​(一)说明​​​​(二)裸机工程......
  • 云小课|手把手教您在PyCharm中连接云端资源进行代码调试
    摘要:让我们看看如何在PyCharm中连接云端资源进行代码调试吧!本文分享自华为云社区《【云小课】EI第54课手把手教您在PyCharm中连接云端资源进行代码调试》,作者:HelloEI。......
  • 记录--手把手教学,实现一个优雅的图片预览
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助在我们开发项目中,经常会遇到预览图片的需求。也就是点击图片,会全屏显示该图片。需求很简单,但是如何让实现......
  • 手把手教你调参 YOLO v6(train.py)
    距离YOLOv6发布已经有一周的时间了,中途修复了好多bug,一起来看看吧官网网址:YOLOv6https://github.com/meituan/YOLOv6train.py参数分析打开文件tools->train.py 1、......
  • Maven从安装到手把手教学进行项目管理
    Maven&目标能够使用Maven进行项目的管理1,MavenMaven是专门用于管理和构建Java项目的工具,它的主要功能有:提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包......
  • 手把手教你搭建mongodb分片集群
    本章用的自己的电脑win10系统 因为工作上的环境也是win的 就没在虚拟机上玩 (ps:其实上面环境都大同小异)在MongoDB(版本6.xx)中,分片是指将collection分散存储到不同......
  • Coolify系列-手把手教学解决局域网局域网中的其他主机访问虚拟机以及docker服务
    背景我在windows电脑安装了一个VM,使用VM开启了Linux服务器,运行docker,下载服务镜像,然后运行服务,然后遇到了主机无法访问服务的问题。问题排查STEP1:首先要开启防火墙端......
  • Coolify系列02-从0到1超详细手把手教你上手Coolify
    接着上集(Coolify系列01-从0到1超详细手把手教你上手Heroku和Netlify的开源替代方案),此时我们已经运行成功,如果没有成功,可以参考我的Coolify系列其他文章来解决问题:镜......