当前位置: 首页 > news >正文

使用PyQt5设计一款简单的计算器

目录

一、环境配置:

二、代码实现

三、主程序

四、总结


        本文使用PyQt5设计一款简单的计算器,可以通过界面交互实现加减乘除的功能,希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。

具体界面如下:

一、环境配置:

使用pip指令安装pyqt5,此处选择5.12.0版本,因为笔者安装的spyder版本为4.1.5,过高的版本不兼容:

pip install PyQt5==5.12.0 -i https://pypi.douban.com/simple
pip install PyQt5-tools -i https://pypi.douban.com/simple
pip install PyQt5designer -i https://pypi.douban.com/simple

二、代码实现

1、引入依赖库。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QLineEdit, QPushButton
from PyQt5.QtCore import Qt

2、定义计算器(Calculator)类,成员函数的功能如下表所示。

函数名称函数功能

__init__()

初始化函数,初始化窗口名称、尺寸、按钮名称、位置、信号响应函数等。

button_click(self, number)

选择数字与小数点

button_clear(self)

实现屏幕以及缓存清空的功能

button_add(self)

实现两个数相加的功能

button_subtract(self)

实现两个数相减的功能

button_multiply(self)

实现两个数相乘的功能

button_divide(self)

实现两个数相除的功能

button_equal(self)

首先判断执行的运算操作,调用对应的函数进行计算,并将结果显示在文本框中
class Calculator(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("计算器")self.setFixedSize(300, 350)   # 固定窗口大小central_widget = QWidget(self)self.setCentralWidget(central_widget)main_layout = QGridLayout()central_widget.setLayout(main_layout)# 添加文本框self.screen = QLineEdit()self.screen.setFixedHeight(40)self.screen.setAlignment(Qt.AlignRight)self.screen.setReadOnly(True)main_layout.addWidget(self.screen, 0, 0, 1, 4)# 添加按钮button_1 = QPushButton("1", clicked=lambda: self.button_click("1"))button_2 = QPushButton("2", clicked=lambda: self.button_click("2"))button_3 = QPushButton("3", clicked=lambda: self.button_click("3"))button_4 = QPushButton("4", clicked=lambda: self.button_click("4"))button_5 = QPushButton("5", clicked=lambda: self.button_click("5"))button_6 = QPushButton("6", clicked=lambda: self.button_click("6"))button_7 = QPushButton("7", clicked=lambda: self.button_click("7"))button_8 = QPushButton("8", clicked=lambda: self.button_click("8"))button_9 = QPushButton("9", clicked=lambda: self.button_click("9"))button_0 = QPushButton("0", clicked=lambda: self.button_click("0"))button_add = QPushButton("+", clicked=self.button_add)button_subtract = QPushButton("-", clicked=self.button_subtract)button_multiply = QPushButton("*", clicked=self.button_multiply)button_divide = QPushButton("/", clicked=self.button_divide)button_clear = QPushButton("清除", clicked=self.button_clear)button_equal = QPushButton("=", clicked=self.button_equal)main_layout.addWidget(button_7, 1, 0)main_layout.addWidget(button_8, 1, 1)main_layout.addWidget(button_9, 1, 2)main_layout.addWidget(button_divide, 1, 3)main_layout.addWidget(button_4, 2, 0)main_layout.addWidget(button_5, 2, 1)main_layout.addWidget(button_6, 2, 2)main_layout.addWidget(button_multiply, 2, 3)main_layout.addWidget(button_1, 3, 0)main_layout.addWidget(button_2, 3, 1)main_layout.addWidget(button_3, 3, 2)main_layout.addWidget(button_subtract, 3, 3)main_layout.addWidget(button_0, 4, 0)main_layout.addWidget(button_clear, 4, 1, 1, 2)main_layout.addWidget(button_add, 4, 3)main_layout.addWidget(button_equal, 5, 0, 1, 4)# 初始化变量self.first_num = Noneself.operation = Nonedef button_click(self, number):current = self.screen.text()self.screen.setText(current + number)def button_clear(self):self.screen.clear()self.first_num = Noneself.operation = Nonedef button_add(self):self.first_num = float(self.screen.text())self.screen.clear()self.operation = "add"def button_subtract(self):self.first_num = float(self.screen.text())self.screen.clear()self.operation = "subtract"def button_multiply(self):self.first_num = float(self.screen.text())self.screen.clear()self.operation = "multiply"def button_divide(self):self.first_num = float(self.screen.text())self.screen.clear()self.operation = "divide"def button_equal(self):second_num = float(self.screen.text())self.screen.clear()if self.operation == "add":result = self.first_num + second_numelif self.operation == "subtract":result = self.first_num - second_numelif self.operation == "multiply":result = self.first_num * second_numelif self.operation == "divide":if second_num == 0:result = "除数不能为 0"else:result = self.first_num / second_numself.screen.setText(str(result))

三、主程序

主程序首先创建窗口对象,接着创建计算器对象并显示窗口,最后设定终止条件。

if __name__ == "__main__":app = QApplication(sys.argv)calc = Calculator()calc.show()sys.exit(app.exec_())

四、总结

这个计算器的优点:

  • 采用了PyQt5模块和Python语言进行设计,实现较为简单,易于理解和修改。
  • 可以进行基本运算操作,包括加、减、乘、除等。

这个计算器的缺点:

  • 功能较为简单,只能进行基础的数学运算,无任何高级功能。
  • 输入输出仅支持数字和基本的加减乘除运算符号,不支持其他字符、函数或变量。
  • 在除数为0时无法做出错误提示,故看起来好像可以除以0一样。

综上所述,该计算器适合作为一个小型的实验项目或界面设计入门示例,但是并不够强大,不能满足更多复杂应用场景的需求。

相关文章:

使用PyQt5设计一款简单的计算器

目录 一、环境配置: 二、代码实现 三、主程序 四、总结 本文使用PyQt5设计一款简单的计算器,可以通过界面交互实现加减乘除的功能,希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。…...

Htop使用说明

目录 引言 什么是htop htop安装 htop界面介绍 htop功能介绍 引言 我们使用服务器的时候常常需要关注下自己的程序资源占用情况,htop就是一种互动式的进程查查看器,整齐用下来感觉比top的逼格高,造作可视化都更方便些,我觉得还…...

PostgreSQL Linux安装

安装依赖: sudo yum -y install readline-devel zlib-devel 安装Postgres: ssh hadoophadoop001 #下载Postgres wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz tar -zxvf postgresql-14.2.tar.gz -C /data #编译前准备 /dat…...

亚商投资顾问 早餐FM/0509车辆电动化

01/亚商投资顾问 早间导读 1.上交所拟于5月11日举办“发现央企投资价值,促进央企估值回归”交流会 2.监管部门十方面举措加强房地产经纪行业管理 3.广东:推动城市公共服务及货运配送车辆电动化替代 4.昆山两楼盘因大幅降价被暂停网签:降幅…...

AI绘画天花板——Midjourney注册使用保姆级教程(5月5日验证有效)

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我,备注:aigc,拉你进群。 现在市面上AI绘图大概有三大阵营:Midjourney、Stable Diffusion,还有一个就是OpenAI实…...

学习笔记(2)项目结构描述 - manifest.json和pages.json

目录 1,manifest.json2,pages.json2.1,pages2.2,globalStyle2.3,tabBar 1,manifest.json 官方详情 uni-app 的 appid 由 DCloud 云端分配,主要用于 DCloud 相关的云服务,请勿自行修…...

vector、deque、list相关知识点

vector erase返回迭代器指向删除元素后的元素insert返回迭代器指插入的元素reserve只给容器底层开指定大小内存空间,并不添加新元素 deque 底层数据结构 动态开辟的二维数组,一维数组从2开始,以2倍方式扩容,每次扩容和&#x…...

多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比

多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比 目录 多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 多维时序 …...

设计模式——适配器模式(类适配器、对象适配器)

是什么? 我们平时的有线耳机接口分为USB的和Type-C的接口,但是手机的耳机插口却只有一个,像华为的耳机插口现在基本都是Type-c的,那如果我们现在只有USB接口的耳机怎么办呢,这个时候就需要使用到一个转换器&#xff0c…...

iOS开发多target

场景 背景:设想一下有一个场景,一个业务分为多种身份,他们大部分功能是相同的,但是也有自己的差异性。这种情况,想要构建出不同身份的APP。你会怎么做??? 当然,你可以拷贝一份代码出来,给项目重新命名。这样做的好处是,他们互相不会冲突,不用去关心是否有逻辑的冲…...

100种思维模型之每日评估思维模型-58

曾子曰:吾日三省吾省,为人谋而不忠乎?与朋友交不信乎?传不习乎? 曾国藩,坚持每日写复盘日记,最后他用自己的实践经历向我们证明:一个智商很平庸、出身很普通且有着各种毛病的人&…...

libreoffice api

libreOffice API是用于访问libreOffice的编程接口。可以使用libreOffice API创建、打开、修改和打印libreOffice文档。 LibreOffice API支持Basic、Java、C/C、Javascript、Python语言。 这是通过一种称为通用网络对象 (Universal Network Objects, UNO) 的技术实现的&#xff…...

全网最火,Web自动化测试驱动模型详全,一语点通超实用...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试模型&a…...

如何写软件测试简历项目经验,靠这个面试都要赶场

一、前言:浅谈面试 面试是我们进入一个公司的门槛,通过了面试才能进入公司,你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试,得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一…...

【Linux】Linux下安装Mysql(图文解说详细版)

文章目录 前言第一步,进到opt文件夹下面,为什么?因为opt文件夹相当于Windows下的D://software第二步,用yum安装第三步,设置mysql的相关配置第四步,设置远程连接。第五步,更改mysql的语言第六步&…...

Cookie和Session的API、登录页面

目录 一、Cookie 和 Session 1、HttpServletRequest 类中的相关方法 2、HttpServletResponse 类中的相关方法 3、HttpSession 类中的相关方法 4、Cookie 类中的相关方法 二、网页登录 1、约定前后端交互接口 2、编写一个简单的登录页面 3、编写一个Servlet 来处理这个…...

C++数据结构:手撕红黑树

目录 一. 红黑树的概念及结构 二. 红黑树节点的定义 三. 红黑树节点的插入 3.1 初步查找插入节点的位置并插入节点 3.2 红黑树结构的调整 3.3 红黑树节点插入完整版代码 四. 红黑树的结构检查 4.1 检查是否为搜索树 4.2 检查节点颜色是否满足要求 附录:红黑…...

Spring IoC 深度学习

Io回顾 IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Jav…...

C语言从入门到精通第17天(指针和数组联用)

指针和数组联用 不同类型指针变量之间的区别数组的指针指针数组 不同类型指针变量之间的区别 在了解数组和指针联用之前,我们先对指针变量进行补充。我们对比一下int *p1和char *p2的区别? 相同点: 都是指针变量都是用来保存一个内存地址编…...

Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: ​onCreate()​​ ​调用时机​:Activity 首次创建时调用。​…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

macOS 终端智能代理检测

🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...