从事嵌入式系统软硬件设计工作已有将尽20年的时间,在进行硬件目标板调试时,常需要上位机软件支持。在进行上位机软件程序的设计时,采用过VB、VB.net和C++等多种语言,偶然的机会发现Python,接触后,立刻感觉到它的强大,现在我的上位机软件编程只用Python。本系列教程将从基于硬件的上位机软件设计的角度着手,系统介绍Python语言,希望读者通过本系列教程的学习,能够对Python语言立刻学以致用,真正将所学知识应用到项目实践中。
开发环境:Visual Studio Code
操作系统:Microsoft Window 7
Python版本:3.7
参考教材:Python快速编程入门,黑马程序员,人民邮电出版社,2017年9月第1版
备注:教程仅适合初学者,高手请绕过。
一、引言
在开始正式讲解Python语言,我们先以一个实例感受一下面向对象的程序设计。回顾Python语言系统学习5:构建PyQt集成开发环境,我们完成一个简单的GUI界面的程序设计。我们使用Qt Designer建立GUI界面,然后将其编译成Python语言源码,再加入入口程序,最后运行,屏幕上显示了一个简单的GUI界面。
不过上述的设计方法是存在问题的,如果我们在Qt Designer中对界面进行了重新修改,再编译时,我们原先手动加入的程序都会被覆盖,我们还需重新加入,非常繁琐;而且,当我们的界面设计的比较复杂时,Ui_MainWindow.py里面的程序就会很庞杂,此时在加入自身的程序,就会使得整个程序异常的凌乱,较难维护。
如何解决上述问题呢?这就需要面向对象程序设计了。面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。通过上述分析,我们就可以得出一个新的构建GUI界面的解决方法,那就是把Ui_MainWindow当作父类,自己再建立一个类并继承于Ui_MainWindow,这样我们就可以把自己需要控制的逻辑写在自己的类里,而Ui_MainWindow用Qt Designer生成即可。
二、设计步骤
1、在硬盘上建立文件夹,并设置文件夹的名称为ex03。
2、启动Visual Studio Code,打开该文件夹。
3、在”资源管理器“面板中,点击右键,在弹出的快捷菜单中选择”PYQT:New Form“。
4、在Qt Designer应用程序中,点击new按钮,如下图所示,建立新的Form。
5、在接下来弹出的对话框中,我们选择Main Window,然后点击Create按钮进行建立。
6、移除菜单栏。
7、移除状态栏。
8、给控件命名。
9、给出主窗体名。
10、保存。
11、编译主窗体。
12、新建application.py。
13、在application.py中加入下列程序。
# 系统包
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
# 项目包
from Ui_MainWindow import Ui_MainWindow
class CMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent = None):
super(CMainWindow, self).__init__(parent)
self.setupUi(self)
# 主窗体设置
self.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = CMainWindow()
sys.exit(app.exec_())
14、运行,看下效果。
15、回到Qt Designer编辑信号和槽。
16、将button信号的槽设置为主窗体。
17、点击Edit,加入槽。
18、点击“+”,加入槽。
19、将槽的名字设置为Add。
20、将butAdd信号的槽设置为Add。
21、重新对MainWindow进行保存。
22、重新编译。
23、在程序中,加入Add函数,为了完整起见,将application.py的所有代码贴出,以供参考。
# 系统包
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
# 项目包
from Ui_MainWindow import Ui_MainWindow
class CMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent = None):
super(CMainWindow, self).__init__(parent)
self.setupUi(self)
# 主窗体设置
self.show()
def Add(self):
number1 = int(self.txtNumber1.text())
number2 = int(self.txtNumber2.text())
number3 = number1 + number2
self.txtResult.setText(str(number3))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = CMainWindow()
sys.exit(app.exec_())
24、运行效果。
三、注解
1、import sys
输入sys模块,主要用于启动时进行参数传递,PyQt5的QApplication可以接收系统参数。
2、from PyQt5 import QtCore, QtGui, QtWidgets
输入QtCore、QtGui和QtWidgets模块,这样我们在后面的程序中就可以直接引用QtCore、QtGui和QtWidgets了。
3、if __name__ == '__main__':
如果是直接调用该程序就执行后续的语句,如果是模块调用该程序,就不执行后续的语句。这种写法主要用于模块的测试,我们把模块和测试语句写在一起,如果是测试就执行测试语句,如果是模块调用,就不执行后续语句。
4、app = QtWidgets.QApplication(sys.argv)
建立QApplicaion对象。
5、sys.exit(app.exec_())
执行事件循环,至此程序就运行起来了。当主窗体销毁的时候(例如我们点击了主窗体右上角的关闭按钮),该函数将返回0。正好被sys.exit函数接收,程序退出。
任何问题,只需在此文章的评论处留言即可,我将尽力解答,不要试图采用其它的联系方式,我一概不理会。
原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。