获取更多文章和更新,请关注我的个人主页:https://leiting6.cn
为什么需要模块化?
模块化编程是每门编程语言都需要使用到的技能,好处呢就是方便管理,便于理清思路。具体到本系列教程中简易计算器的设计,模块化的必要性又在哪呢?
根据前面3篇文章的介绍,不出意外的话同学们也都能实现一个简单的加法器的功能了。我在自学PyQt5过程中,相当长一段时间里也都是按照这样的流程来编写代码的,甚至已经完成了几个小工具的设计。然而我自己也时常意识到自己会陷入一种窘境:只要想在QtCreator稍微改动一下UI界面,再利用pyuic5生成.py文件,就要重新再贴一遍自己添加的代码块,有首部import的、有中间自定义方法的、还有末尾的类外执行的...实在太麻烦了。
大家可能还记得,在介绍使用QtCreator的时候我也说过,QtCreator设计出来的是一个类,而类是面向对象语言的重要概念之一,python也不例外。类能干嘛呢?能用来实例化对象、能继承、能改写。至此,同学们估计也已经意识到了,为什么我们要用模块 --- 没错,我们要把pyuic5生成的.py文件作为模块,而自己手动编写的代码放到主程序中,调用模块,继承、改写它!
模块化操作
修改UI界面,重新生成.py文件
首先我们象征性的修改一下UI界面,假装是因为设计需要。如图,不增删控件的前提下,拖拽一下控件的位置、更改一下MainWindow的大小,效果如下:
然后再重新生成一下.py文件,为了不覆盖之前的main.py,我们这次重新取一个名字,让他看起来更像一个模块:
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中添加一下代码:
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基础知识。
保存后在命令行中执行:
python cacl.py
可以看到:
改写Ui_MainWindow类
好了,接下来需要添加之前已经作过说明的后台逻辑代码。为了能模块化管理这个小工程,而且不改动ui_mainwindow.py,上面我们已经在calc.py中引入了Ui_MainWindow类。根据之前的经验,原初的Ui_MainWindowbi并不能实现加法操作,我们还需要改写它。所以,在calc.py中,新建一个类继承并改写Ui_MainWindow,calc.py全部代码如下:
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简单测试一下功能,正常:
模块化之后,如果我们改动了.ui文件,尽管放心大胆地重新生成模块文件,只要不改动控件的名称,主程序都可以照常运行,是不是方便了很多?确实模块化的管理才是最科学的。
写在最后
这个系列的教程到此就结束了,后面会不定期补一些使用PyQt5的小技巧等等。欢迎大家留言,一起交流,一起进步。