获取更多文章和更新,请关注我的个人主页:www.leiting6.cn

为什么需要模块化?

模块化编程是每门编程语言都需要使用到的技能,好处呢就是方便管理,便于理清思路。具体到本系列教程中简易计算器的设计,模块化的必要性又在哪呢?

根据前面3篇文章的介绍,不出意外的话同学们也都能实现一个简单的加法器的功能了。我在自学PyQt5过程中,相当长一段时间里也都是按照这样的流程来编写代码的,甚至已经完成了几个小工具的设计。然而我自己也时常意识到自己会陷入一种窘境:只要想在QtCreator稍微改动一下UI界面,再利用pyuic5生成.py文件,就要重新再贴一遍自己添加的代码块,有首部import的、有中间自定义方法的、还有末尾的类外执行的…实在太麻烦了。

大家可能还记得,在介绍使用QtCreator的时候我也说过,QtCreator设计出来的是一个类,而类是面向对象语言的重要概念之一,python也不例外。类能干嘛呢?能用来实例化对象、能继承、能改写。至此,同学们估计也已经意识到了,为什么我们要用模块 — 没错,我们要把pyuic5生成的.py文件作为模块,而自己手动编写的代码放到主程序中,调用模块,继承、改写它!

模块化操作

修改UI界面,重新生成.py文件

首先我们象征性的修改一下UI界面,假装是因为设计需要。如图,不增删控件的前提下,拖拽一下控件的位置、更改一下MainWindow的大小,效果如下:

image.png
image.png

然后再重新生成一下.py文件,为了不覆盖之前的main.py,我们这次重新取一个名字,让他看起来更像一个模块:

1
pyuic5 -o ui_mainwindow.py mainwindow.ui

加入以后还要加入其它的模块,可以取名字为ui_subwindow、ui_subwidget等等。

打开ui_mainwindow.py发现和之前生成的main.py差不多。这一次我们就不改动它了,再同一个文件夹再新建一个空白的py文件,命名为calc.py。calc.py就是模块化之后的主程序文件。

为calc.py添加代码,显示程序界面

在calc.py中添加一下代码:

1
2
3
4
5
6
7
8
9
10
11
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from ui_mainwindow import Ui_MainWindow as UIM

if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = UIM()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

这段代码比较眼熟。没错,想要显示窗口,流程是没有变的,只是在calc.py中我们引入了ui_mainwindow包中的Ui_MainWindow类,重新命名为UIM,在下面的代码中,同样将UIM类实例化为ui,然后执行setupUi()方法,显示主窗口,等待退出。看不明白的需要补一下python基础知识。

保存后在命令行中执行:

1
python cacl.py

可以看到:

image.png
image.png

改写Ui_MainWindow类

好了,接下来需要添加之前已经作过说明的后台逻辑代码。为了能模块化管理这个小工程,而且不改动ui_mainwindow.py,上面我们已经在calc.py中引入了Ui_MainWindow类。根据之前的经验,原初的Ui_MainWindowbi并不能实现加法操作,我们还需要改写它。所以,在calc.py中,新建一个类继承并改写Ui_MainWindow,calc.py全部代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from ui_mainwindow import Ui_MainWindow as UIM

class NewUiMainWindow(UIM):
def setupFunction(self):
self.pushButton_calc.clicked.connect(self.get_sum)

def get_sum(self):
adder1 = self.lineEdit_Adder1.text() # 获取第一个文本框中的内容存入adder1
adder2 = self.lineEdit_Adder2.text() # 获取第二个文本框中的内容存入adder2
sum = int(adder1) + int(adder2) # 将adder1和adder2强制转换为整形,计算出两数之和存入sum
self.lineEdit_sum.setText(str(sum)) # 将sum强制转换为字符串,填入lineEdit_sum

if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = NewUiMainWindow()
ui.setupUi(MainWindow)
ui.setupFunction()
MainWindow.show()
sys.exit(app.exec_())

执行calc.py简单测试一下功能,正常:

image.png
image.png

模块化之后,如果我们改动了.ui文件,尽管放心大胆地重新生成模块文件,只要不改动控件的名称,主程序都可以照常运行,是不是方便了很多?确实模块化的管理才是最科学的。

写在最后

这个系列的教程到此就结束了,后面会不定期补一些使用PyQt5的小技巧等等。欢迎大家留言,一起交流,一起进步。