Pyqt5小案例,界面与逻辑分离的小计算器程序
直接看下最终效果:

使用技术总结
-
使用Designer设计界面
-
使用pyuic5命令导出到python文件
-
新建逻辑处理文件,继承pyuic5导出的文件的类,在里面编写信号与槽的处理逻辑
使用Designer设计界面
要使用Designer,安装一个Python库即可:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5 pyqt5-tools
我用的是python 3.9版本,发现3.10会报错,3.9没问题

在此过程中,用到了如下组件:
-
QLabel、QlineEdit、QPushButton
-
先从小范围再到大范围,进行布局管理
-
按钮的上下方,加上弹簧
然后保存成ui文件
使用pyuic5将ui文件导出成python文件

然后执行如下命令:
pyuic5 -o computer.py computer.ui
即可生成computer.py
为什么要用界面与逻辑分离
主要是用Designer设计的界面,肯定要多次调整的。如果每次调整后,生成新的py文件,就会把自己写的代码给覆盖了。
因此,最好是界面的ui生成的python代码,和自己的分离。
用继承机制就可以:
先看下pyuic5生成的代码文件(如下代码是自动生成的,不用多看):
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'computer.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(1006, 577)self.verticalLayout = QtWidgets.QVBoxLayout(Form)self.verticalLayout.setObjectName("verticalLayout")self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.label = QtWidgets.QLabel(Form)self.label.setObjectName("label")self.horizontalLayout.addWidget(self.label)self.lineEdit_num01 = QtWidgets.QLineEdit(Form)self.lineEdit_num01.setObjectName("lineEdit_num01")self.horizontalLayout.addWidget(self.lineEdit_num01)self.verticalLayout.addLayout(self.horizontalLayout)self.horizontalLayout_2 = QtWidgets.QHBoxLayout()self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.label_2 = QtWidgets.QLabel(Form)self.label_2.setObjectName("label_2")self.horizontalLayout_2.addWidget(self.label_2)self.lineEdit_num02 = QtWidgets.QLineEdit(Form)self.lineEdit_num02.setObjectName("lineEdit_num02")self.horizontalLayout_2.addWidget(self.lineEdit_num02)self.verticalLayout.addLayout(self.horizontalLayout_2)spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.verticalLayout.addItem(spacerItem)self.horizontalLayout_3 = QtWidgets.QHBoxLayout()self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.pushButton_add = QtWidgets.QPushButton(Form)self.pushButton_add.setObjectName("pushButton_add")self.horizontalLayout_3.addWidget(self.pushButton_add)self.pushButton_minus = QtWidgets.QPushButton(Form)self.pushButton_minus.setObjectName("pushButton_minus")self.horizontalLayout_3.addWidget(self.pushButton_minus)self.pushButton_multi = QtWidgets.QPushButton(Form)self.pushButton_multi.setObjectName("pushButton_multi")self.horizontalLayout_3.addWidget(self.pushButton_multi)self.pushButton_divide = QtWidgets.QPushButton(Form)self.pushButton_divide.setObjectName("pushButton_divide")self.horizontalLayout_3.addWidget(self.pushButton_divide)self.verticalLayout.addLayout(self.horizontalLayout_3)spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.verticalLayout.addItem(spacerItem1)self.label_result = QtWidgets.QLabel(Form)font = QtGui.QFont()font.setPointSize(18)self.label_result.setFont(font)self.label_result.setStyleSheet("QLabel{\n"
"color:red;\n"
"}")self.label_result.setText("")self.label_result.setObjectName("label_result")self.verticalLayout.addWidget(self.label_result)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.label.setText(_translate("Form", "请输入第一个数字:"))self.label_2.setText(_translate("Form", "请输入第二个数字:"))self.pushButton_add.setText(_translate("Form", "+"))self.pushButton_minus.setText(_translate("Form", "-"))self.pushButton_multi.setText(_translate("Form", "*"))self.pushButton_divide.setText(_translate("Form", "/"))
在里面有个类,叫做:Ui_Form
我们可以继承这个类,然后编写编写自己的逻辑即可
import sysfrom computer import Ui_Form
from PyQt5.QtWidgets import QApplication, QWidgetclass MyUiComputer(Ui_Form):def __init__(self, window):super().__init__()self.setupUi(window)self.pushButton_add.clicked.connect(self.do_compute("+"))self.pushButton_minus.clicked.connect(self.do_compute("-"))self.pushButton_multi.clicked.connect(self.do_compute("*"))self.pushButton_divide.clicked.connect(self.do_compute("/"))def do_compute(self, method):def func():try:num01 = self.lineEdit_num01.text()num02 = self.lineEdit_num02.text()if method == "+":self.label_result.setText("计算结果:" + str(int(num01) + int(num02)))elif method == "-":self.label_result.setText("计算结果:" + str(int(num01) - int(num02)))elif method == "*":self.label_result.setText("计算结果:" + str(int(num01) * int(num02)))elif method == "/":self.label_result.setText("计算结果:" + str(int(num01) / int(num02)))except Exception as e:self.label_result.setText(f"error: {e}")return funcif __name__ == "__main__":app = QApplication(sys.argv)window = QWidget()my_ui_computer = MyUiComputer(window)window.show()sys.exit(app.exec_())
这是我们自己的代码,有几点:
1、需要自己初始化 QWidget 作为入口窗口 然后调用pyuic5生成代码中的 self.setupUi(window) 设置主窗口;
2、这个代码主要是编写自己的信号与槽的链接
3、这个代码也有一个知识,connect的槽函数,是可以传参数的,技巧就是自己的函数返回一个函数 见do_compute函数
总结
依然回顾下pyqt5开发的流程:
-
用Designer设计界面
-
用pyuic5将ui文件导出成python文件
-
用继承的方法,编写自己的类文件,实现自己的信号处理逻辑
-
自己的代码中,初始化入口的Window,传给pyuic5的文件作为启动入口
相关文章:
Pyqt5小案例,界面与逻辑分离的小计算器程序
直接看下最终效果: 使用技术总结 使用Designer设计界面 使用pyuic5命令导出到python文件 新建逻辑处理文件,继承pyuic5导出的文件的类,在里面编写信号与槽的处理逻辑 使用Designer设计界面 要使用Designer,安装一个Python库即…...
leaflet加载KML文件,显示图形(方法2)
第049个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载KML文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共66…...
Mysql 部署 MGR 集群
0. 参考文章 官方文档: MySQL :: MySQL 8.0 Reference Manual :: 18.2 Getting Started 博客: MGR 单主模式部署教程(基于 MySQL 8.0.28) - 墨天轮 (modb.pro) mysql MGR单主模式的搭建 - 墨天轮 (modb.pro) MySQL 5.7 基于…...
迁移至其他美国主机商时需要考虑的因素
网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量,并在谷歌的SERP中获得更好的排名。因此,在构建企业网站时,选择合适的主机商相当重要。不过就以美国主机为例,由于每个…...
【数据结构】第二章 线性表
文章目录第二章 知识体系2.1 线性表的定义和基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表的基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表的基本操作实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链…...
RESTful API 为何成为顶流 API 架构风格?
作者孙毅,API7.ai 技术工程师,Apache APISIX Committer 万物互联的世界充满着各式各样的 API ,如何统筹规范 API 至关重要。RESTful API 是目前世界上最流行的 API 架构风格之一,它可以帮助你实现客户端与服务端关注点分离&#x…...
Python基础知识点汇总(列表)
列表的含义 列表由一系列按特定顺序排列的元素组成,是Python中内置的可变序列。 **注:**列表的所有元素放在中括号[]中,相邻的两个元素用逗号分隔; 可将整数、实数、字符串、列表、元组等任何类型的内容放到列表中,且同一列表的元素类型可以不同。 列表的创建和删除 1.…...
新的一年软件测试行业的趋势能够更好?
如果说,2022年对于全世界来说,都是一场极大的挑战的话;那么,2023年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…...
Threejs中的Shadow Mapping(阴影贴图)
简而言之,步骤如下: 1.从灯光位置视点(阴影相机)创建深度图。 2.从相机的位置角度进行屏幕渲染,在每个像素点,比较由阴影相机的MVP矩阵计算的深度值和深度图的值的大小,如果深度图值小的话&…...
本质安全设备标准(IEC60079-11)的理解(四)
本质安全设备标准(IEC60079-11)的理解(四) 对于标准中“Separation”的理解 IEC60079-11使用了较长的篇幅来说明设计中需要考虑到的各种间距, 这也从一定程度上说明了间距比较重要,在设计中是需要认真考虑…...
(record)QEMU安装最小linux系统——TinyCore(命令行版)
文章目录QEMU安装最小linux系统——TinyCore参考QEMU使用qemu创建tinycore虚拟机再次启动文件保存QEMU安装最小linux系统——TinyCore 简单记录安装过程和记录点 参考 [原创] qemu 与 Tiny Core tinycore的探索 QEMU qemu不多介绍,这里是在WSL2上安装的linux版…...
C++中的cast类型转换
reinterpret_cast用法:reinpreter_cast<type-id> (expression)type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。这个操作符能够在非相关的类型之间转换。操作结果…...
西瓜数据集读取的详细解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...
Mac开发环境配置
一、mac 安装homebrew 1. 必要性 homebrew可以通过bash命令快速安装配置开发环境,并且在大多数情况下可以实现环境的自动配置。(一键安装配置) 2. 收益 节省开发环境工具配置时间,提高人效。 3. 安装步骤 打开mac终端…...
概率论面试题1:玫瑰花
概率论面试题 1. 一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略࿱…...
【DGL】图分类
目录概述数据集定义Data LoaderDGL中的batched graph定义模型训练参考概述 除了节点级别的问题——节点分类、边级别的问题——链接预测之外,还有整个图级别的问题——图分类。经过聚合、传递消息得到节点和边的新的表征后,映射得到整个图的表征。 数据…...
时间复杂度的计算(2023-02-10)
时间复杂度的计算 时间复杂度的计算分为三大类:一层循环、二层循环和多层循环。 一层循环 1.找出循环趟数t及每轮循环i的变化值 2.确立循环停止的条件 3.得出t与i之间的关系 4.联立两式,得出结果 eg: void fun(int n) {int i0;while (i*i*i<n)i;…...
测试开发之Django实战示例 第六章 追踪用户行为
第六章 追踪用户行为在之前的章节里完成了小书签将外站图片保存至本站的功能,并且实现了通过jQuery发送AJAX请求,让用户可以对图片进行喜欢/不喜欢操作。这一章将学习如何创建一个用户关注系统和创建用户行为流数据,还将学习Django的信号框架…...
红米9a手动root方法
简介 已知红米6A/6/9/9A/9C/10A机器都可以快速解锁BL,无任何变砖风险 并且秒解锁BL后和官方解锁一样,无任何其他不良影响。推荐大家使用官网解锁,需要等待7天。 BootLoader BootLoader是在操作系统内核运行之前运行的一段小程序。其实…...
Open3D 点云最小二乘法拟合平面(剔除噪声,Python版本)
除了诱惑之外,我可以抵抗任何事物。 ----王尔德 文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这个算法的思路很简单,就是通过剔除一些异常点来拟合更为合适的平面,具体过程如下所示: 1、首先使用最小二乘法拟合一个平面系数的初值。 2、计算所有有效点到拟合…...
QtScrcpy终极指南:高效实现Android投屏控制
QtScrcpy终极指南:高效实现Android投屏控制 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy QtScr…...
WeChatFerry:基于RPC与DLL注入的微信PC端自动化框架深度解析
1. 项目概述与核心价值 最近在折腾微信自动化相关的东西,发现了一个挺有意思的项目——WeChatFerry。这名字起得挺形象,“Ferry”是渡轮的意思,感觉就像是在你的程序和微信客户端之间搭了一座桥,让数据可以安全、稳定地“摆渡”过…...
5分钟掌握Windows安装Android应用的终极方案
5分钟掌握Windows安装Android应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行Android应用,却苦于复杂的…...
NetApp FAS FC SAN存储替换实战:从HP MSA到ONTAP的平滑迁移
1. 项目背景与环境摸底 这次遇到的存储替换项目挺典型的——客户原先用的是HP MSA系列SAN存储,现在要升级到NetApp FAS2750全闪存阵列。现场环境是标准的VMware虚拟化平台,通过FC协议连接存储。说实话,第一次看到旧存储配置时我就发现几个隐患…...
紧密型医共体信息平台厂商行业白皮书:厂商实力及趋势分析
紧密型医共体信息平台厂商行业白皮书:厂商实力及趋势分析一、行业概况医共体信息平台是县域医疗卫生共同体建设的核心数字化工具。以县级医院为枢纽,平台连接县域内各级医疗机构及管理单位,实现数据互通、系统协同与资源共享,打破…...
如何免费解锁Cursor Pro:完整破解方案与实战指南
如何免费解锁Cursor Pro:完整破解方案与实战指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial re…...
科研绘图升级:用CMplot为你的基因组文章制作高颜值SNP密度图(R实战)
科研绘图升级:用CMplot为你的基因组文章制作高颜值SNP密度图(R实战) 在基因组学研究中,数据可视化不仅是结果展示的手段,更是科学叙事的重要语言。一张精心设计的SNP密度图,能够直观呈现全基因组范围内单核…...
Python还是Java?小白程序员必备!收藏这份6个月大模型应用开发学习路线图(附实战项目)
本文针对大模型应用开发,为初学者提供Python/Java语言选择建议,并推出分阶段学习路线图。通过6-8个月学习,涵盖大模型基础、RAG、Agent开发、微调与部署等核心技能。强调实战项目驱动,推荐资源库,最后总结学习建议。适…...
开发者行为数据挖掘:从Stack Overflow发现隐性需求
1. 项目概述:从开发者行为数据挖掘隐性需求在软件开发领域,需求工程一直面临着如何准确捕捉用户真实需求的挑战。传统方法如用户访谈、问卷调查等依赖于用户的主动表达,但开发者往往不会明确说出他们需要什么,而是通过日常行为无意…...
机器学习在芯片电容提取中的应用与CapBench数据集
1. 电容提取与机器学习结合的背景与挑战在芯片设计流程中,电容提取是决定最终产品性能的关键环节。当设计进入物理实现阶段,工程师需要精确计算互连线之间的寄生电容,这些数据直接影响时序分析和功耗估算的准确性。传统基于场求解器的方法&am…...
