【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() 显示窗口。
python 复制代码
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有点呆,欢迎大家讨论,共同进步

python 复制代码
    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))

简单的计算功能

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

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

清零

python 复制代码
    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 = ""

计算结果

python 复制代码
    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}")

显示文本

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

键盘输出

python 复制代码
    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()

整体代码

python 复制代码
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()

界面展示

有任何问题可以联系我,欢迎大家来讨论,共同进步。

相关推荐
shanks6621 小时前
【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点
python·pyqt
深蓝海拓1 天前
基于深度学习的视觉检测小项目(十六) 用户管理界面的组态
人工智能·python·深度学习·qt·pyqt
西农小陈2 天前
Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器
开发语言·python·小程序·pycharm·numpy·pyqt·pillow
w(゚Д゚)w吓洗宝宝了2 天前
命令模式 - 命令模式的设计思想
c++·命令模式
西农小陈3 天前
Python-基于PyQt5,json和playsound的通用闹钟
开发语言·windows·python·pycharm·pyqt
深蓝海拓3 天前
使用QSqlQueryModel创建交替背景色的表格模型
数据库·qt·pyqt
zxdzxdzzxd5 天前
记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。
网络协议·udp·pyqt
博一波8 天前
【设计模式-行为型】命令模式
设计模式·命令模式
恋恋西风9 天前
PyQt 异步任务 多线程的几种方案
java·开发语言·python·pyqt