【PyQt】超级超级笨的pyqt计算器案例

计算器

1.QT Designer设计外观

  • 1.pushButton
  • 2.textEdit
  • 3.groupBox
  • 4.布局设计
    在这里插入图片描述

2.加载ui文件

导入模块:
  • sys:用于处理命令行参数。

  • QApplication:PyQt5 应用程序类。

  • QWidget:窗口基类。

  • uic:用于加载 .ui 文件。

  • QIcon:用于设置窗口图标。

MyWindow 类:
  • 继承自 QWidget,用于创建主窗口。

  • init 方法中调用 self.init_ui() 初始化界面。

  • init_ui 方法中加载 .ui 文件并设置窗口图标和标题。

加载 .ui 文件:
  • 使用 uic.loadUi(“./计算器.ui”) 加载 .ui 文件,并将其赋值给 self.ui。

  • self.ui 是一个包含 .ui 文件中所有控件的对象。

设置窗口图标和标题:
  • 使用 setWindowIcon 设置窗口图标。

  • 使用 setWindowTitle 设置窗口标题。

显示窗口:
  • 在 if name == “main”: 中创建 QApplication 和 MyWindow 实例,并调用 w.ui.show() 显示窗口。
import sys

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()
    def init_ui(self):
        self.ui = uic.loadUi("./计算器.ui")
        print(self.ui.__dict__)  # 查看ui文件中有哪些控件
        self.ui.setWindowIcon(QIcon('img.png'))
        self.ui.setWindowTitle("傻瓜计算器")  # 修改标题的名称
if __name__=="__main__":
    app = QApplication(sys.argv)

    w = MyWindow()
    # 展示窗口
    w.ui.show()

    app.exec()

代码解释

超级呆瓜的初始化,刚开始学习QT有点呆,欢迎大家讨论,共同进步

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./计算器.ui",self)
        # print(self.ui.__dict__)  # 查看ui文件中有哪些控件
        self.ui.setWindowIcon(QIcon('img.png'))
        self.ui.setWindowTitle("计算器")  # 修改标题的名称
        self.x = ""

        # 初始化控件
        self.textEdit = self.ui.textEdit # 计算过程框
        self.textEdit_2 = self.ui.textEdit_2 # 计算结果框
        self.pushButton_1=self.ui.pushButton_1 # C :清零
        self.pushButton_2 = self.ui.pushButton_2 # X:后退一格
        self.pushButton_3 = self.ui.pushButton_3 # %:百分号
        self.pushButton_4 = self.ui.pushButton_4 # /:除号
        self.pushButton_5 = self.ui.pushButton_5 # 7
        self.pushButton_6 = self.ui.pushButton_6 # 8
        self.pushButton_7 = self.ui.pushButton_7 # 9
        self.pushButton_8 = self.ui.pushButton_8 # *:乘号
        self.pushButton_9 = self.ui.pushButton_9 # 4
        self.pushButton_10 = self.ui.pushButton_10 # 5
        self.pushButton_11 = self.ui.pushButton_11 # 6
        self.pushButton_12 = self.ui.pushButton_12 # -:减法
        self.pushButton_13 = self.ui.pushButton_13 # 1
        self.pushButton_14 = self.ui.pushButton_14 # 2
        self.pushButton_15 = self.ui.pushButton_15 # 3
        self.pushButton_16 = self.ui.pushButton_16 # +:加法
        self.pushButton_17 = self.ui.pushButton_17 # e
        self.pushButton_18 = self.ui.pushButton_18 # 0
        self.pushButton_19 = self.ui.pushButton_19 # .
        self.pushButton_20 = self.ui.pushButton_20 # =:等号

        # 设置框的样式
        self.textEdit.setText("0")
        self.textEdit.setAlignment(Qt.AlignRight)  # # 设置文本右对齐
        self.textEdit.setReadOnly(True)  # 只能进行读取
        self.textEdit.setStyleSheet("font-size: 24px; height: 60px;")  # 设置字体样式
        self.textEdit_2.setText("result")
        self.textEdit_2.setAlignment(Qt.AlignRight)  # # 设置文本右对齐
        self.textEdit_2.setReadOnly(True)  # 只能进行读取
        self.textEdit_2.setStyleSheet("font-size: 24px; height: 60px;")  # 设置字体样式

        # 设置按钮格式
        for i in range(20):
            x = f"pushButton_{i+1}"
            self.pushButton_name = getattr(self, x)  # 动态访问按钮对象
            self.pushButton_name.setStyleSheet("font-size: 18px; padding: 10px;")
            self.text = self.pushButton_name.text()
            self.pushButton_name.clicked.connect(lambda _, t=self.text: self.on_button_click(t))

简单的计算功能

  • 清零
  • 计算结果
  • 显示文本
    def on_button_click(self, text):
        # 可以获取所有符号
        print(text)

        if text == 'C':
            self.reset_calculator()
        elif text == '=':
            self.calculate_result()
        else:
            self.text_shaw(text)

清零

    def reset_calculator(self):
        self.textEdit.clear()
        self.textEdit.setText("0")
        self.textEdit.setAlignment(Qt.AlignRight)  # 设置文本右对齐
        self.textEdit.setReadOnly(True)  # 只能进行读取
        self.textEdit_2.setText("....")
        self.textEdit_2.setAlignment(Qt.AlignRight)  # 设置文本右对齐
        self.textEdit_2.setReadOnly(True)  # 只能进行读取
        self.x = ""

计算结果

    def calculate_result(self):
        all_text =  self.textEdit.toPlainText()
        print(all_text)
        print(type(all_text))
        try:
            result = sp.sympify(all_text)
            print(f"表达式 '{all_text}' 的计算结果是: {result}")
            self.textEdit_2.setText(f"{result}")
            self.textEdit_2.setAlignment(Qt.AlignRight)



        except sp.SympifyError as e:
            print(f"无法解析表达式: {e}")

显示文本

    def text_shaw(self,text):
        self.x += f"{text}"
        self.textEdit.setText(self.x)
        self.textEdit.setAlignment(Qt.AlignRight)

键盘输出

    def keyPressEvent(self, event):
        key = event.text()
        print(key)
        if key in '0123456789.+-*/':
            self.on_button_click(key)
            print(key)
        elif event.key() in (Qt.Key_Enter, Qt.Key_Return):
            self.on_button_click('=')
        elif event.key() == Qt.Key_Escape:
            self.reset_calculator()

整体代码

import sys
import re
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
from PyQt5 import uic
import sympy as sp #计算的库,可以实现四则运算

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./计算器.ui",self)
        # print(self.ui.__dict__)  # 查看ui文件中有哪些控件
        self.ui.setWindowIcon(QIcon('img.png'))
        self.ui.setWindowTitle("计算器")  # 修改标题的名称
        self.x = ""

        # 初始化控件
        self.textEdit = self.ui.textEdit # 计算过程框
        self.textEdit_2 = self.ui.textEdit_2 # 计算结果框
        self.pushButton_1=self.ui.pushButton_1 # C :清零
        self.pushButton_2 = self.ui.pushButton_2 # X:后退一格
        self.pushButton_3 = self.ui.pushButton_3 # %:百分号
        self.pushButton_4 = self.ui.pushButton_4 # /:除号
        self.pushButton_5 = self.ui.pushButton_5 # 7
        self.pushButton_6 = self.ui.pushButton_6 # 8
        self.pushButton_7 = self.ui.pushButton_7 # 9
        self.pushButton_8 = self.ui.pushButton_8 # *:乘号
        self.pushButton_9 = self.ui.pushButton_9 # 4
        self.pushButton_10 = self.ui.pushButton_10 # 5
        self.pushButton_11 = self.ui.pushButton_11 # 6
        self.pushButton_12 = self.ui.pushButton_12 # -:减法
        self.pushButton_13 = self.ui.pushButton_13 # 1
        self.pushButton_14 = self.ui.pushButton_14 # 2
        self.pushButton_15 = self.ui.pushButton_15 # 3
        self.pushButton_16 = self.ui.pushButton_16 # +:加法
        self.pushButton_17 = self.ui.pushButton_17 # e
        self.pushButton_18 = self.ui.pushButton_18 # 0
        self.pushButton_19 = self.ui.pushButton_19 # .
        self.pushButton_20 = self.ui.pushButton_20 # =:等号

        # 设置框的样式
        self.textEdit.setText("0")
        self.textEdit.setAlignment(Qt.AlignRight)  # # 设置文本右对齐
        self.textEdit.setReadOnly(True)  # 只能进行读取
        self.textEdit.setStyleSheet("font-size: 24px; height: 60px;")  # 设置字体样式
        self.textEdit_2.setText("result")
        self.textEdit_2.setAlignment(Qt.AlignRight)  # # 设置文本右对齐
        self.textEdit_2.setReadOnly(True)  # 只能进行读取
        self.textEdit_2.setStyleSheet("font-size: 24px; height: 60px;")  # 设置字体样式

        # 设置按钮格式
        for i in range(20):
            x = f"pushButton_{i+1}"
            self.pushButton_name = getattr(self, x)  # 动态访问按钮对象
            self.pushButton_name.setStyleSheet("font-size: 18px; padding: 10px;")
            self.text = self.pushButton_name.text()
            self.pushButton_name.clicked.connect(lambda _, t=self.text: self.on_button_click(t))

    # 实现了按键显示
    def on_button_click(self, text):
        # 可以获取所有符号
        print(text)

        if text == 'C':
            self.reset_calculator()
        elif text == '=':
            self.calculate_result()
        else:
            self.text_shaw(text)

    def reset_calculator(self):
        self.textEdit.clear()
        self.textEdit.setText("0")
        self.textEdit.setAlignment(Qt.AlignRight)  # 设置文本右对齐
        self.textEdit.setReadOnly(True)  # 只能进行读取
        self.textEdit_2.setText("....")
        self.textEdit_2.setAlignment(Qt.AlignRight)  # 设置文本右对齐
        self.textEdit_2.setReadOnly(True)  # 只能进行读取
        self.x = ""
    def calculate_result(self):
        all_text =  self.textEdit.toPlainText()
        print(all_text)
        print(type(all_text))
        try:
            result = sp.sympify(all_text)
            print(f"表达式 '{all_text}' 的计算结果是: {result}")
            self.textEdit_2.setText(f"{result}")
            self.textEdit_2.setAlignment(Qt.AlignRight)



        except sp.SympifyError as e:
            print(f"无法解析表达式: {e}")

        result = re.split(r"([+*/-])", all_text) # 保留分隔符
        print(result)

    def text_shaw(self,text):
        self.x += f"{text}"
        self.textEdit.setText(self.x)
        self.textEdit.setAlignment(Qt.AlignRight)

    def keyPressEvent(self, event):
        key = event.text()
        print(key)
        if key in '0123456789.+-*/':
            self.on_button_click(key)
            print(key)
        elif event.key() in (Qt.Key_Enter, Qt.Key_Return):
            self.on_button_click('=')
        elif event.key() == Qt.Key_Escape:
            self.reset_calculator()

if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.ui.show()
    app.exec()

界面展示
在这里插入图片描述
有任何问题可以联系我,欢迎大家来讨论,共同进步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter Scaffold 页面结构

Material是一套设计风格,提供了大量的小部件,这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…

2月3日星期一今日早报简报微语报早读

2月3日星期一,农历正月初六,早报#微语早读。 1、多个景区发布公告:售票数量已达上限,请游客合理安排行程; 2、2025春节档总票房破70亿,《哪吒之魔童闹海》破31亿; 3、美宣布对中国商品加征10…

大模型本地化部署(Ollama + Open-WebUI)

文章目录 环境准备下载Ollama模型下载下载Open-WebUI 本地化部署的Web图形化界面本地模型联网查询安装 Docker安装 SearXNG本地模型联网查询 环境准备 下载Ollama 下载地址:Ollama网址 安装完成后,命令行里执行命令 ollama -v查看是否安装成功。安装成…

10 Flink CDC

10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数…

【25考研】南开软件考研复试复习重点!

一、复试内容 复试采取现场复试的方式。复试分为笔试、机试和面试三部分。三部分合计100分,其中笔试成绩占30%、机试成绩占30%、面试成绩占40%。 1.笔试:专业综合基础测试 考核方式:闭卷考试,时长为90分钟。 笔试考查内容范围…

【Cadence仿真技巧学习笔记】求解65nm库晶体管参数un, e0, Cox

在设计放大器的第一步就是确定好晶体管参数和直流工作点的选取。通过阅读文献,我了解到L波段低噪声放大器的mos器件最优宽度计算公式为 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p​23​ωLCox​Rs…

【leetcode练习·二叉树拓展】归并排序详解及应用

本文参考labuladong算法笔记[拓展:归并排序详解及应用 | labuladong 的算法笔记] “归并排序就是二叉树的后序遍历”——labuladong 就说归并排序吧,如果给你看代码,让你脑补一下归并排序的过程,你脑子里会出现什么场景&#xff…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…

MySQL锁类型(详解)

锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…

《苍穹外卖》项目学习记录-Day11销量排名统计

销量排名需要查两张表,一张是order_detail,它里面有number字段,这个字段体现了商品的销售的份数。我们仅仅查这一张表是不够的,因为用户下单了,下单了之后就会产生订单数据和对应的订单详情数据,假设他下完…

走向基于大语言模型的新一代推荐系统:综述与展望

HightLight 论文题目:Towards Next-Generation LLM-based Recommender Systems: A Survey and Beyond作者机构:吉林大学、香港理工大学、悉尼科技大学、Meta AI论文地址: https://arxiv.org/abs/2410.1974 基于大语言模型的下一代推荐系统&…

Vue3学习笔记-模板语法和属性绑定-2

一、文本插值 使用{ {val}}放入变量&#xff0c;在JS代码中可以设置变量的值 <template><p>{{msg}}</p> </template> <script> export default {data(){return {msg: 文本插值}} } </script> 文本值可以是字符串&#xff0c;可以是布尔…

python算法和数据结构刷题[5]:动态规划

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种算法思想&#xff0c;用于解决具有最优子结构的问题。它通过将大问题分解为小问题&#xff0c;并找到这些小问题的最优解&#xff0c;从而得到整个问题的最优解。动态规划与分治法相似&#xff0c;但区别在于动态…

【阅读笔记】New Edge Diected Interpolation,NEDI算法,待续

一、概述 由Li等提出的新的边缘指导插值(New Edge—Di-ected Interpolation&#xff0c;NEDI)算法是一种具有良好边缘保持效果的新算法&#xff0c;它利用低分辨率图像与高分辨率图像的局部协方差问的几何对偶性来对高分辨率图像进行自适应插值。 2001年Xin Li和M.T. Orchard…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

DeepSeek R1 简易指南:架构、本地部署和硬件要求

DeepSeek 团队近期发布的DeepSeek-R1技术论文展示了其在增强大语言模型推理能力方面的创新实践。该研究突破性地采用强化学习&#xff08;Reinforcement Learning&#xff09;作为核心训练范式&#xff0c;在不依赖大规模监督微调的前提下显著提升了模型的复杂问题求解能力。 技…

直方图:摄影中的视觉数据指南

目录 一、直方图基础&#xff1a;揭开它的神秘面纱 二、解读直方图类型&#xff1a;亮度与色彩的密码 &#xff08;一&#xff09;亮度直方图 &#xff08;二&#xff09;RGB 直方图 三、拍摄中巧用直方图&#xff1a;优化曝光与效果 &#xff08;一&#xff09;精准判断曝…

力扣动态规划-19【算法学习day.113】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.矩形中移动的最大次数 题目链接…

树莓派pico入坑笔记,睡眠

关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 关于在 CircuitPython 中使用警报和浅/深度睡眠的更多信息&#xff0c;请参阅此学习指南。 树莓派pico支持浅睡眠和深度睡眠&#xff0c;其中深度睡眠唤醒后将从boot.py开始运行 支持按时间唤醒和引…