PyQt5学习笔记07——面向过程和面向对象的编程过程理解

文章目录

  • 基于PyQt5的GUI开发过程——基于面向过程的编程方式和基于面向对象的编程方式
    • 1、面向过程的代码编程方式——类似“顺序结构”控制语句
    • 2、面向过程和面向对象的编程方法的区别
          • 1)使用面向过程的编程方式实现
          • 2)使用面向对象的编程方式实现
    • 3、面向对象的代码方式实现GUI

基于PyQt5的GUI开发过程——基于面向过程的编程方式和基于面向对象的编程方式

1、面向过程的代码编程方式——类似“顺序结构”控制语句

# -*- coding: utf-8 -*-
"""---面向过程的编程方式
主要特点:所有代码实现过程都是以“顺序控件”方式执行。
          所有的界面和控件都是逐个逐个以代码实现。
主要缺陷:
     1)代码冗余,且代码杂乱;
     2)代码不宜阅读和修改;
     3)可维护性差,比较复杂;
面向过程代码实现GUI的步骤:
     1)导入包
     2)创建一个应用程序
     3)控件操作(创建控件、设置控件、添加子控件、其他(信号、事件、槽))
     4)开始执行应用程序,并进入消息循环
下面是一个面向过程的代码例子:
     创建一个空界面、一个按钮、一个标签等控件。
--"""
# 导入需要的包
from PyQt5.Qt import *
import sys
# 1、创建一个应用程序
app = QApplication(sys.argv)  #创建一个应用程序(比不可少的)
print(app.arguments())   #打印应用程序信息,及文件名['D:/ProgramFiles64/MyCode_Files/Python+PyQT/Qttest01/顶层控件操作.py']
#2、控件操作——创建控件,设置控件(大小、位置、样式...),事件,信号的处理
#2.1 创建控件
window = QWidget()
push = QPushButton(window)
label = QLabel(window)
label.setText("xxxx")

label1 = QLabel(window)
label.setText("xxxx")

label2 = QLabel(window)
label.setText("xxxx")

label3 = QLabel(window)
label.setText("xxxx")

# 2.2 设置控件
window.setWindowTitle("创建一个空白窗口")
window.resize(400,400) #修改窗口大小
push.setWindowTitle("按钮控件")
push.setText("创建一个按钮控件")
label.setWindowTitle("标签控件")
label.setText("创建一个标签控件!")


# 2.3 展示控件
window.show()
push.show()
label.show()
#开始执行应用程序,并进入消息循环
sys.exit(app.exec_())

2、面向过程和面向对象的编程方法的区别

下面使用一个简单的图形说明面向过程和面向对象的编程方法的区别。
PyQt5学习笔记07——面向过程和面向对象的编程过程理解_第1张图片
图 1 GUI示意图

1)使用面向过程的编程方式实现

图1中除了大的矩形框控件,中间还有11个小的子控件。代码实现过程如小节1的代码。

2)使用面向对象的编程方式实现

PyQt5学习笔记07——面向过程和面向对象的编程过程理解_第2张图片
图2 面向对象的GUI示意图

如图2所示,我们将其所有的控件分成3类,分别看作是A、B和C类(例如,A类是菜单栏、B类是工具栏、C类是其他控件集)。从Python的PyQt5的编程思想角度理解,就相当于大矩形框是一个父类,ABC三类分别是子类,而子控件的实现代码则包括在子类中。

类的封装示意图:
PyQt5学习笔记07——面向过程和面向对象的编程过程理解_第3张图片
PyQt5学习笔记07——面向过程和面向对象的编程过程理解_第4张图片
面向对象的GUI实现过程大致如下:
1)首先创建类(Class)。Class A(父类);Class B(父类);Class C(父类);
2)创建完类之后,在主应用程序中创建“对象”。例如: a=A() ,a—是对象名,A是类名;
3)如类中初始化方法(init())已包含了子控件的创建、添加、设置或其他功能的代码,则在主应用程序中只需要创建一个对象即可实现GUI界面上子控件的添加。
4)如果类中初始化方法(init())不包含子控件的创建、添加、设置或其他功能的代码或调用子控件方法代码,则在主应用程序中需要创建一个对象并且使用调用类的子控件方法。才能实现GUI界面上子控件的添加。

为了更通俗易懂的弄懂PyQt5的GUI编程,我们使用“汽车生产过程”和“零件生产商”的例子来解释。
1)类——类似零件生产商

我们将“类”看成是“汽车零件生产商”;然而类分为“父类”和“子类”,那么我们将父子类看成是一家零件生产公司的董事长和其儿子。
假设父亲(父类)的公司生产的是汽车的发动机、变速器和相关的主要零件;
儿子在继承父亲部分股份、财产和资源的情况下,自己创业成立一家生产“汽车电子产品”的子公司(子公司挂子父(亲)公司名下)。
如下图所示:
1)BuiltCar是子类,QWidget是父类。
2)def init(self):是子类初始化方法,在此方法中,必须继承父类的初始化方法,否则创建的主窗口失败,从而导致其他控件添加失败。相当于儿子继承父亲财产而没有使用父亲公司的客户资源,那么他公司生产的汽车零件很难销售出去。
3)def setup_ui(self):是子类的功能实现方法(函数)。相当于子公司生产的零配件。
4)根据下图所示的类,创建的对象car = BuiltCar()只能实现创建一个主窗口功能,不能实现标签控件的添加。因为在子类的初始化方法(def init(self))中没有调用setup_ui方法。就相当于子公司生产的零件都是最原始的零件,没有经过任何组装。若将setup_ui方法添加到def init(self)中之后,则创建对象之后,即创建了一个主窗口,也实现在主窗口中添加标签控件。相当于汽车的原始零件在出厂之前就将相关的组装成一个整体,然后再卖给汽车生产商。
PyQt5学习笔记07——面向过程和面向对象的编程过程理解_第5张图片

2)对象——汽车或汽车零件

汽车或汽车零件都可以看成是“对象”。

3)主应用程序——汽车生产过程

我们可以把“应用程序”看成是一个“汽车组装过程”。 主应用程序的主要框架相当于汽车车身;就像如下代码:

# 导入需要的包
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)  #创建一个应用程序(比不可少的)
#===========================

    功能代码块

#=============================
sys.exit(app.exec_())    #开始执行应用程序,并进入消息循环

“对象的创建”相当于汽车生产公司与零配件生产公司之间签订了一个购买零件的合同。就想如下代码:

app = QApplication(sys.argv)  #创建一个应用程序(比不可少的)
#===========================
car = BuiltCar()  #创建一个对象汽车。BuiltCar是一个类,car是对象名。相当于汽车生产公司与零配件生产公司之间签订了一个购买零件的合同。

  功能代码块

car.show()     
#=============================

“对象的方法调用”相当于将零配件安装到汽车整车当中去。就像如下代码:

#===============================================================
class BuiltCar(QWidget):
    def __init__(self):
        super().__init__()    #继承超(父)类的初始化方法
        self.setWindowTitle("我的GUI")
        self.resize(400,400)

    def setup_ui(self):
        label = QLabel(self)
        label.setText("第1个标签控件")
#===============================================================
# 1、创建一个应用程序
app = QApplication(sys.argv)  #创建一个应用程序(比不可少的)
#===========================
car = BuiltCar()
car.setup_ui()   #调用子类的方法(函数)。相当于将购买的零配件组装到车身上。
#    功能代码块

car.show()      #GUI界面的展现。相当于整车的初步成型。
#=============================
sys.exit(app.exec_())        #开始执行应用程序,并进入消息循环

总之,基于PyQt5的应用软件开发就相当于汽车的生产。汽车生产商不是所有的零配件都生产,而是从其他合作商购买零配件,然后进行组装(汽车生产商具有汽车组装流水线设备)。而应用程序开发也类似,整个系统是有不同的类、对象和组合框架构成。

3、面向对象的代码方式实现GUI

完整代码如下:

# -*- coding: utf-8 -*-
"""
===========
"""
# 导入需要的包
from PyQt5.Qt import *
import sys

#===============================================================
class BuiltCar(QWidget):
    def __init__(self):
        super().__init__()    #继承超(父)类的初始化方法
        self.setWindowTitle("我的GUI")
        self.resize(400,400)
        self.setup_ui()
        #self.create_button()

    def setup_ui(self):
        label = QLabel(self)
        label.setText("第1个标签控件")
    def create_button(self):
        push = QPushButton(self)
        push.setText("创建一个按钮控件")

#===============================================================
app = QApplication(sys.argv)  #创建一个应用程序(比不可少的)
#===========================
car = BuiltCar()
car.create_button()

car.show()
#=============================
sys.exit(app.exec_())        #开始执行应用程序,并进入消息循环

你可能感兴趣的:(Python基础,PyQt5,GUI设计,Python开发)