PyQt5入门系列4:模块化手动编写的代码块

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

为什么需要模块化?

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

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

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

模块化操作

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

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

image.png

然后再重新生成一下.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

可以看到:


image.png
改写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简单测试一下功能,正常:

image.png

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

写在最后

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,207评论 4 16
  • 二川 前一天的一篇文章中我提到了二川,一个闺蜜就跟我说“二川好可怜,他是谁呀”,今天我就开始讲“二川的故事”,需要...
    朵彤阅读 1,280评论 0 0
  • 上个周末,爸爸给我报了一个新班,名叫“新节拍”,这里是专门学舞蹈、书法、武术等特长的,我报的是画漫画的班。 ...
    曹子恒阅读 392评论 0 0
  • 在消费者手里拿铁和卡布奇诺怎么去区分? 拿铁的单词(Latte),在意大利国家是牛奶的意思,其实拿铁是不等于咖啡的...
    麦麦啡语阅读 1,021评论 1 1
  • 公司引进了一批985和211高等院校的实习生,他们身上有着令众人羡慕的共同标签:重点院校、专业背景好、年轻有朝气。...
    朱凤玲阅读 269评论 0 1