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

news2025/1/10 16:57:40

文章目录

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

专栏列表

  • 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 == '':
        continue
    button = 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 QFont

class 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 == '':
                continue

            button = 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 函数,因为它可能会执行不安全的代码。
  • 在实际开发中,应考虑使用更安全和健壮的数学表达式解析器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产化软件内容及要求

国产化软件是指在中国自主研发的软件产品,旨在减少对外部技术的依赖,提升国家信息安全和软件产业的自主可控能力。国产化软件涵盖了从操作系统、数据库、办公软件、各类应用软件、中间件等多个层面。 操作系统:国产操作系统如银河麒麟、UOS、…

博客建站8 - 选择hexo博客网站的主题

1. 环境说明2. 体验过的hexo站点主题 2.1. Acorn2.2. hexo-theme-cafe2.3. volantis2.4. NexT 3. 参考文档 1. 环境说明 博客框架: Hexo网站主题: Volantis评论系统: Disqus服务器: 阿里云ECS服务器系统: Ubuntu 24.04 LTS 2. …

仕考网:结构化面试流程介绍

(一)结构化面试 结构化面试,也叫做标准化面试,考官按照预先设定好的一套试题以问答方式与应试者当面交谈,根据应试者的言语、行为表现,对其相关能力和个性特征作出相应评价。 (二)考试流程 抵达考场——…

CAD 多个页面在一个任务栏图标设置

命令行输入快捷键op或: 下图打对号,确定即可。

vsCode 自动发布文件到服务器文件

1.新建 publish.cmd文件 xcopy D:\_____\*.* \\_____\jyou /s /e /y源文件夹和目标文件夹按照自己替换,/s /e /y会复制空白文件夹,且遇到相同文件直接覆盖 2.将这个文件复制到nodemodules/bin目录下 3.在package.json中配置发布命令

翻译器大分享,这5款你选哪款?

作为一个经常需要阅读和翻译各种学术论文和专业文档的研究生,我深知找到一款好用的翻译工具是多么重要。今天,我就来跟大家聊聊我用过的四款翻译PDF文档的工具它们的表现如何呢?一起来看看吧! 一、福昕在线翻译 网址:…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-38 LVDS Select IO高速Serdes

软件版本:VIVADO2021.1 操作系统:WIN10 64bit 硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台:米联客-MLK-H3-CZ08-7100开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

使用 VisionTransformer(VIT) FineTune 训练驾驶员行为状态识别模型

一、VisionTransformer(VIT) 介绍 大模型已经成为人工智能领域的热门话题。在这股热潮中,大模型的核心结构 Transformer 也再次脱颖而出证明了其强大的能力和广泛的应用前景。Transformer 自 2017年由Google提出以来,便在NLP领域掀起了一场革命。相较于…

Typora 画图技巧(思维利器,含文本及图示~!)

Typora 画图技巧(思维利器,含文本及图示~!) 设置图表示例流程图横向流程图竖向流程图标准流程图标准流程图(横向) UML时序图UML时序图一UML时序图二UML标准时序图一UML标准时序图二 甘特图类图状态图饼图 &…

找高清视频素材,上这8个网站

分享8个提供高清视频素材的优秀网站,无论你是在制作宣传片、社交媒体内容还是影视作品,这些资源都能帮助你找到理想的素材,让你的作品更加生动和引人注目。 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 菜鸟图库免费视频素材下载。网站…

UWB定位室外基站

定位基站,型号SW,是一款基于无线脉冲技术开发的UWB定位基站,基站可用于人员、车辆、物资的精确定位, 该基站专为恶劣环境使用而设计,防尘、防水等级IP67,工业级标准支持365天连续运行,本安防爆可…

Java并发编程实战 05 | 什么是线程组?

1.线程组介绍 在 Java 中,ThreadGroup 用于表示一组线程。通过 ThreadGroup,我们可以批量控制和管理多个线程,使得线程管理更加方便。 ThreadGroup 和 Thread 的关系就像它们的字面意思一样简单:每个线程 (Thread) 必定属于一个线…

7.统一网关-Gateway

文章目录 1.统一网关介绍2.网关开发3.predicate4.Route Predicate Factories(路由断言工厂)4.1Path 路由断言工厂4.2.Method 路由断言工厂4.3 Header 路由断言工厂4.4 Query 路由断言工厂4.5 Host 路由断言工厂4.6 After 路由断言工厂4.7 Before 路由断言工厂4.8 Between 路由断…

FPGA实现串口升级及MultiBoot(二)FPGA启动流程

这个系列开篇肯定要先了解FPGA的启动流程,试想一下:我想实现MultiBoot,那么我应该在什么时候开始升级,升级失败后FPGA进行了哪些操作,以及怎么回到Golden区? 还有一个问题,就是我硬件打板回来&a…

Chrome下载视频的插件

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

SprinBoot+Vue个性化旅游推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

数学建模_数据预处理流程(全)

数据预处理整体流程图 一般数据预处理流程 处理缺失值:填补或删除缺失值。处理异常值:检测并处理异常值。数据编码:将分类变量进行标签编码或独热编码。数据标准化/归一化:对数据进行标准化或归一化处理。连续变量离散化&#xff…

人机交互系统中的人脸讲话生成系统调研

《Human-Computer Interaction System: A Survey of Talking-Head Generation》 图片源:https://github.com/Yazdi9/Talking_Face_Avatar 目录 前言摘要一、背景介绍二、人机交互系统体系结构2.1. 语音模块2.2. 对话系统模块2.3. 人脸说话动作生成 三 人脸动作生成…

基于人工智能的语音情感识别系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 语音情感识别是人工智能的一项重要应用,旨在通过分析语音信号中的特征来判断说话者的情感状态,如“愤怒”、“…

1800 万,财务自由了

《黑神话:悟空》 距离《黑神话:悟空》上线(8 月 20 日)上线已过去半个月,从刚开始全网热议,连官方都下场点评,到现在的逐渐回归平静。 不是游戏圈或是对数据不敏感的网友,可能会落入…