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

【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 sysfrom PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uicclass 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 # 7self.pushButton_6 = self.ui.pushButton_6 # 8self.pushButton_7 = self.ui.pushButton_7 # 9self.pushButton_8 = self.ui.pushButton_8 # *:乘号self.pushButton_9 = self.ui.pushButton_9 # 4self.pushButton_10 = self.ui.pushButton_10 # 5self.pushButton_11 = self.ui.pushButton_11 # 6self.pushButton_12 = self.ui.pushButton_12 # -:减法self.pushButton_13 = self.ui.pushButton_13 # 1self.pushButton_14 = self.ui.pushButton_14 # 2self.pushButton_15 = self.ui.pushButton_15 # 3self.pushButton_16 = self.ui.pushButton_16 # +:加法self.pushButton_17 = self.ui.pushButton_17 # eself.pushButton_18 = self.ui.pushButton_18 # 0self.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 # 7self.pushButton_6 = self.ui.pushButton_6 # 8self.pushButton_7 = self.ui.pushButton_7 # 9self.pushButton_8 = self.ui.pushButton_8 # *:乘号self.pushButton_9 = self.ui.pushButton_9 # 4self.pushButton_10 = self.ui.pushButton_10 # 5self.pushButton_11 = self.ui.pushButton_11 # 6self.pushButton_12 = self.ui.pushButton_12 # -:减法self.pushButton_13 = self.ui.pushButton_13 # 1self.pushButton_14 = self.ui.pushButton_14 # 2self.pushButton_15 = self.ui.pushButton_15 # 3self.pushButton_16 = self.ui.pushButton_16 # +:加法self.pushButton_17 = self.ui.pushButton_17 # eself.pushButton_18 = self.ui.pushButton_18 # 0self.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()

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

相关文章:

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

计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块: sys:用于处理命令行参数。 QApplication:PyQt5 应用程序类。 QWidget:窗口基类。 uic:用于加载 .ui 文件。…...

Git 的起源与发展

序章:版本控制的前世今生 在软件开发的漫长旅程中,版本控制犹如一位忠诚的伙伴,始终陪伴着开发者们。它的存在,解决了软件开发过程中代码管理的诸多难题,让团队协作更加高效,代码的演进更加有序。 简单来…...

预防和应对DDoS的方法

DDoS发起者通过大量的网络流量来中断服务器、服务或网络的正常运行,通常由多个受感染的计算机或联网设备(包括物联网设备)发起。 换种通俗的说法,可以将其想象成高速公路上的一次突然的大规模交通堵塞,阻止了正常的通勤…...

51单片机开发:独立按键实验

实验目的:按下键盘1时,点亮LED灯1。 键盘原理图如下图所示,可见,由于接GND,当键盘按下时,P3相应的端口为低电平。 键盘按下时会出现抖动,时间通常为5-10ms,代码中通过延时函数delay…...

02.04 数据类型

请写出以下几个数据的类型: 整数 a ----->int a的地址 ----->int* 存放a的数组b ----->int[] 存放a的地址的数组c ----->int*[] b的地址 ----->int* c的地址 ----->int** 指向printf函数的指针d ----->int (*)(const char*, ...) …...

FPGA学习篇——开篇之作

今天正式开始学FPGA啦,接下来将会编写FPGA学习篇来记录自己学习FPGA 的过程! 今天是大年初六,简单学一下FPGA的相关概念叭叭叭! 一:数字系统设计流程 一个数字系统的设计分为前端设计和后端设计。在我看来&#xff0…...

【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…...

【RocketMQ】RocketMq之IndexFile深入研究

一:RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分: CommitLog:存储消息的元数据。所有消息都会顺序存⼊到CommitLog⽂件当中。CommitLog由多个⽂件组成,每个⽂件固定⼤⼩1G。以第⼀条消 息的偏移量为⽂件名。 ConsumerQue…...

小白零基础--CPP多线程

进程 进程就是运行中的程序线程进程中的进程 1、C11 Thread线程库基础 #include <iostream> #include <thread> #include<string>void printthread(std::string msg){std::cout<<msg<<std::endl;for (int i 0; i < 1000; i){std::cout<…...

利用deepseek参与软件测试 基本架构如何 又该在什么环节接入deepseek

利用DeepSeek参与软件测试&#xff0c;可以考虑以下基本架构和接入环节&#xff1a; ### 基本架构 - **数据层** - **测试数据存储**&#xff1a;用于存放各种测试数据&#xff0c;包括正常输入数据、边界值数据、异常数据等&#xff0c;这些数据可以作为DeepSeek的输入&…...

大模型微调技术总结及使用GPU对VisualGLM-6B进行高效微调

1. 概述 在深度学习中&#xff0c;微调&#xff08;Fine-tuning&#xff09;是一种重要的技术&#xff0c;用于改进预训练模型的性能。在预训练模型的基础上&#xff0c;针对特定任务&#xff08;如文本分类、机器翻译、情感分析等&#xff09;&#xff0c;使用相对较小的有监…...

WPF进阶 | WPF 样式与模板:打造个性化用户界面的利器

WPF进阶 | WPF 样式与模板&#xff1a;打造个性化用户界面的利器 一、前言二、WPF 样式基础2.1 什么是样式2.2 样式的定义2.3 样式的应用 三、WPF 模板基础3.1 什么是模板3.2 控件模板3.3 数据模板 四、样式与模板的高级应用4.1 样式继承4.2 模板绑定4.3 资源字典 五、实际应用…...

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

自动化构建-make/Makefile 【Linux基础开发工具】

文章目录 一、背景二、Makefile编译过程三、变量四、变量赋值1、""是最普通的等号2、“:” 表示直接赋值3、“?” 表示如果该变量没有被赋值&#xff0c;4、""和写代码是一样的&#xff0c; 五、预定义变量六、函数**通配符** 七、伪目标 .PHONY八、其他常…...

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧&#xff0c;相关文章包括且不限于&#xff1a; python学opencv|读取图像-CSDN博客 python学opencv|读取图像&#xff08;四十九&#xff09;原理探究&#xff1a;使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…...

通信方式、点对点通信、集合通信

文章目录 从硬件PCIE、NVLINK、RDMA原理到通信NCCL、MPI原理&#xff01;通信实现方式&#xff1a;机器内通信、机器间通信通信实现方式&#xff1a;通讯协调通信实现方式&#xff1a;机器内通信&#xff1a;PCIe通信实现方式&#xff1a;机器内通信&#xff1a;NVLink通信实现…...

TCP编程

1.socket函数 int socket(int domain, int type, int protocol); 头文件&#xff1a;include<sys/types.h>&#xff0c;include<sys/socket.h> 参数 int domain AF_INET: IPv4 Internet protocols AF_INET6: IPv6 Internet protocols AF_UNIX, AF_LOCAL : Local…...

OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化

内容目标 学习如何使用 OpenAI 辅助生成和优化多表 SQL 查询了解如何获取数据库结构信息并与 OpenAI 结合使用 实操步骤 1. 创建 SQLite 数据库示例 创建数据库及表结构&#xff1a; import sqlite3# 连接 SQLite 数据库&#xff08;如果不存在则创建&#xff09; conn sq…...

Apache Iceberg数据湖技术在海量实时数据处理、实时特征工程和模型训练的应用技术方案和具体实施步骤及代码

Apache Iceberg在处理海量实时数据、支持实时特征工程和模型训练方面的强大能力。Iceberg支持实时特征工程和模型训练&#xff0c;特别适用于需要处理海量实时数据的机器学习工作流。 Iceberg作为数据湖&#xff0c;以支持其机器学习平台中的特征存储。Iceberg的分层结构、快照…...

QT交叉编译环境搭建(Cmake和qmake)

介绍一共有两种方法&#xff08;基于qmake和cmake&#xff09;&#xff1a; 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别&#xff1a;CMake 和 qmake 都是自动化构建工具&#xff0c;用于简化构建过程&#xff0c;管理编译设置&…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...