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

Python教程(二十一) : 从零开始制作计算器应用【PyQt6】

文章目录

    • 专栏列表
    • 环境准备
    • 代码解析
      • 主要组件
      • 初始化界面
      • 布局设置
      • 事件处理
      • 计算逻辑
    • 运行应用
    • 完整代码
    • 示例截图
    • 总结
    • 注意

专栏列表

  • Python教程(十):面向对象编程(OOP)
  • Python教程(十一):单元测试与异常捕获
  • Python教程(十二):面向对象高级编程详解
  • Python教程(十三):常用内置模块详解
  • Python教程(十四):Requests模块详解
  • Python教程(十五):IO 编程
  • Python教程(十六):进程、线程、线程锁
  • Python教程(十七):协程、 asyncio与 aiohttp【异步IO】
  • Python教程(十八): 从零到一教会你用 Django【Web 开发】
  • Python教程(十九):使用Tkinter制作计算器
  • Python教程(二十) : 十分钟入门【PyQt6】

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


在这篇文章中,我们将通过一个简单的示例来展示如何使用 PyQt6 库来创建一个图形用户界面(GUI)计算器。PyQt6 是一个用于创建跨平台桌面应用程序的库,它提供了丰富的控件和工具,使得开发图形界面变得简单快捷。

环境准备

在开始之前,请确保你已经安装了 PyQt6。如果尚未安装,可以通过 pip 安装:

pip install PyQt6

代码解析

主要组件

  • mainWidget:继承自 QWidget,作为计算器的主窗口。
  • calc:继承自 QMainWindow,作为应用程序的主窗口。

初始化界面

mainWidget 类中,我们首先创建了一个 QLineEdit 控件用于显示输入的表达式和计算结果。然后,我们定义了一个 start 方法来初始化计算器的界面布局。

def start(self):grid = QGridLayout(self)grid.setSpacing(10)self.setGeometry(300, 300, 400, 300)grid.addWidget(self.edit, 0, 0, 1, 4)# ...

布局设置

我们使用 QGridLayout 来组织计算器的按钮。通过一个嵌套的列表推导式,我们创建了一个包含按钮位置的列表,然后遍历这个列表,为每个按钮设置位置和事件处理函数。

positions = [(i+1, j) for i in range(5) for j in range(4)]
for position, name in zip(positions, names):if name == '':continuebutton = QPushButton(name)button.setFont(QFont('Arial', 12))button.clicked.connect(lambda: self.on_button_click(name))grid.addWidget(button, *position)

事件处理

  • on_button_click:当按钮被点击时,这个方法会被调用,它将按钮的文本添加到 QLineEdit 控件中。
  • calculate_result:当点击等号按钮时,这个方法会被调用,它使用 eval 函数来计算表达式的结果,并将其显示在 QLineEdit 控件中。
  • clear_screen:清空 QLineEdit 控件中的文本。
  • back:删除 QLineEdit 控件中的最后一个字符。

计算逻辑

计算器的核心逻辑在于 calculate 方法,它使用 Python 的 eval 函数来计算字符串形式的数学表达式。这是一个简单直接的方法,但在实际应用中,我们可能需要一个更健壮的解析器来处理复杂的表达式和错误。

def calculate(self, expression):try:result = eval(expression)return str(result)except Exception as e:return "Error"

运行应用

最后,我们定义了一个 main 函数来启动应用程序。这个函数创建了一个 QApplication 实例和一个 calc 窗口,并显示它。

def main():app = QApplication(sys.argv)ex = calc()sys.exit(app.exec())

完整代码

import sys
from PyQt6.QtWidgets import (QWidget, QPushButton, QApplication, QMainWindow, QGridLayout, QLineEdit)
from PyQt6.QtGui import QFontclass mainWidget(QWidget):def __init__(self):super().__init__()self.edit = QLineEdit("123")self.edit.setFont(QFont('Arial', 20))self.start()def add(self,*args):sender = self.sender()print('print',args)print('print',sender.text())def start(self):grid = QGridLayout(self)grid.setSpacing(10)self.setGeometry(300,300,400,300)grid.addWidget(self.edit, 0, 0,1,4)names = ['Cls', 'Bck', '', '','7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+']positions = [(i+1, j) for i in range(5) for j in range(4)]for position, name in zip(positions, names):if name == '':continuebutton = QPushButton(name)button.setFont(QFont('Arial', 12))button.clicked.connect(lambda: self.on_button_click(name))grid.addWidget(button, *position)back = QPushButton("Bck")back.setFont(QFont('Arial', 12))back.clicked.connect(lambda: self.back())grid.addWidget(back,1,1)equal = QPushButton("=")equal.setFont(QFont('Arial', 12))equal.clicked.connect(lambda: self.calculate_result())grid.addWidget(equal, 5, 2)Cls = QPushButton("Cls")Cls.setFont(QFont('Arial', 12))Cls.clicked.connect(lambda: self.clear_screen())grid.addWidget(Cls, 1, 0)def calculate(self,expression):try:result = eval(expression)return str(result)except Exception as e:return "Error"# 按钮点击事件def on_button_click(self,*args):current_expression = self.edit.text()text = self.sender().text()print(current_expression , text)self.edit.setText( current_expression +text)# # 清除屏幕def clear_screen(self):self.edit.setText('')# 计算结果def calculate_result(self):current_expression = self.edit.text()result = self.calculate(current_expression)print(result)self.edit.setText(result)# 计算结果def back(self):current_expression = self.edit.text()result =current_expression[0:len(current_expression)-1]self.edit.setText(result)class calc(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.statusBar().showMessage('计算器准备就绪')widget = mainWidget()self.setCentralWidget(widget)self.setGeometry(300, 300, 400, 300)self.setWindowTitle('PyQt6 制作计算器')self.show()def main():app = QApplication(sys.argv)ex = calc()sys.exit(app.exec())if __name__ == '__main__':main()

示例截图

在这里插入图片描述

总结

通过这篇文章,我们展示了如何使用 PyQt6 来创建一个简单的计算器应用。这个示例涵盖了 PyQt6 应用程序的基本结构,包括窗口、布局、控件和事件处理。希望这个示例能够帮助你理解 PyQt6 的基本概念,并激发你进一步探索和学习 PyQt6 的兴趣。

注意

  • 实际应用中应避免使用 eval 函数,因为它可能会执行不安全的代码。
  • 在实际开发中,应考虑使用更安全和健壮的数学表达式解析器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WebGIS二维基础,地图开发必修框架:Canvas
  • ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果
  • 会计凭证IDOC有关增强
  • Bat常用指令
  • 【MySQL】MySQL库的操作
  • 数据结构基础讲解(七)——数组和广义表专项练习
  • 哈希表,算法
  • ECMAScript与JavaScript的区别:深入解析与代码示例
  • 【基础算法总结】二分查找
  • 算法练习题19——leetcode141环形链表
  • 基于51单片机的智能农业滴灌控制系统proteus仿真
  • 鸿蒙OS开发秘籍:打造优雅的登录状态管理系统
  • ai绘图软件哪个好用?解锁5款小白必备工具
  • Git的基本概念和使用方式
  • shader 案例学习笔记之绘制圆
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【comparator, comparable】小总结
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Flannel解读
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JAVA并发编程--1.基础概念
  • js学习笔记
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • magento2项目上线注意事项
  • Node 版本管理
  • SpingCloudBus整合RabbitMQ
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 分布式熔断降级平台aegis
  • 后端_ThinkPHP5
  • 欢迎参加第二届中国游戏开发者大会
  • 前端攻城师
  • 入门级的git使用指北
  • 王永庆:技术创新改变教育未来
  • Java数据解析之JSON
  • ​​​【收录 Hello 算法】9.4 小结
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​iOS安全加固方法及实现
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #13 yum、编译安装与sed命令的使用
  • #DBA杂记1
  • #QT(智能家居界面-界面切换)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • %@ page import=%的用法
  • (003)SlickEdit Unity的补全
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)逆序输出字符串
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (循环依赖问题)学习spring的第九天