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

【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()

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


http://www.kler.cn/a/530977.html

相关文章:

  • 如何处理 Typecho Joe 主题被抄袭或盗版的问题
  • Linux环境下的Java项目部署技巧:安装 Mysql
  • 第三篇:模型压缩与量化技术——DeepSeek如何在边缘侧突破“小而强”的算力困局
  • CoRAG 来自微软与人大的创新RAG框架技术
  • 论文阅读(十):用可分解图模型模拟连锁不平衡
  • 玩转Docker | 使用Docker部署SSCMS内容管理系统
  • deepseek 本地化部署和小模型微调
  • 当前热门文生图大模型介绍与优缺点分析
  • Rust `struct`和 `enum`番外《哪吒、白蛇传?》
  • 嵌入式知识点总结 操作系统 专题提升(三)-并发与互斥
  • 使用React和Material-UI构建TODO应用的前端UI
  • 无人机飞行惯导系统技术详解
  • deepseek本地部署+结合思路
  • sql主从同步
  • Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法
  • URL 和 URI 的区别
  • java命令详解
  • 二维前缀和:高效求解矩阵区域和问题
  • 【实战篇】Android安卓本地离线实现视频检测人脸
  • LabVIEW图片识别逆向建模系统
  • 嵌入式知识点总结 操作系统 专题提升(四)-上下文
  • Vue3学习笔记-条件渲染和列表渲染-3
  • WPS动画:使图形平移、围绕某个顶点旋转一定角度
  • [SAP ABAP] ABAP SQL跟踪工具
  • RabbitMQ快速上手及入门
  • 机器学习10