谷动谷力

 找回密码
 立即注册
查看: 1279|回复: 0
收起左侧

wxPython应用软件开发快速入门教程

[复制链接]
发表于 2023-3-16 23:22:42 | 显示全部楼层 |阅读模式
本帖最后由 sunsili 于 2023-8-28 14:15 编辑

wxPython应用软件开发快速入门教程


wxPython是一款优秀的GUI(图形用户界面)开发框架,使用它可以开发出界面精美、功能强大的应用软件。这里以开发一个图书管理系统为例,讲解wxPython开发应用软件的方法和技巧。图书管理系统要实现的功能包括:连接Mysql数据库获取图书数据列表,实现图书信息数据的查看、插入、修改、删除,数据批量导入,以及根据书名关键字和出版社进行组合查询筛选的功能。


1.主窗口界面

主窗口是该软件与用户进行交互的入口,其核心是创建数据展现区、查询筛选功能区、增删改查功能区和批量导入功能区的版块布局,并从数据库获取图书信息数据。窗口界面布局中,要用到的控件包括:wx.StaticText(静态文本标签)、wx.TextCtrl(文本框)、wx.ComboBox(下拉列表)、wx.Button(按钮)、wx.ListCtrl(数据列表)、wx.FileDialog(文件选择对话框)、wx.MessageDialog(消息对话框)。软件运行主界面如下图:
640?wx_fmt=other.jpg

2.子窗口及功能

点击主窗口的功能按钮,会打开相应子窗口。我们使用self.mainframe = parent来声明mainframe为父窗口,也就是软件的主窗口界面,方便后面在子窗口的事件函数中操作父窗口中的数据列表。以打开新增图书信息的窗口为例,下面代码表示了从主窗口打开子窗口的方法:
show_addFrame = AddFrame(self, "新增窗口")
show_addFrame.Show(True)

新增和编辑图书信息窗口:
640?wx_fmt=other.jpg

以删除图书记录为例,以下代码示意了从主窗口的数据列表框中选定一条记录,取得其ID值(数据列表框中索引为0的字段的值),作为参数传递给dbconn类中的函数deleteBook()执行删除操作。
selectRow = self.list.GetFirstSelected()
bookid=self.list.GetItem(selectRow, 0)
.Textself.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()函数的形式参数也与之一一对应。程序在后台运行的过程中,用户需要了解程序执行的进度,可以通过消息框来向用户反馈操作的结果。
640?wx_fmt=other.jpg

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.前后端数据的同步

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


+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-5-30 05:48 , Processed in 0.104776 second(s), 39 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表