PyQt5 简易计算器

。。。

初学pyqt5,界面比较简陋,逻辑处理上也是自己一步一步的整理的,所以看着会比较乱,可能存在bug,可以在评论告知一下。
内容不够严谨,仅供参考!

代码

pyqt5的designer设计GUI界面

在这里插入图片描述

ui–>py代码

ui转译为py后的代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 520)
        Form.setMinimumSize(QtCore.QSize(400, 520))
        Form.setMaximumSize(QtCore.QSize(500, 650))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/img/images/btn_gold.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox_3 = QtWidgets.QGroupBox(self.groupBox)
        self.groupBox_3.setTitle("")
        self.groupBox_3.setObjectName("groupBox_3")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_3)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.textEdit = QtWidgets.QTextEdit(self.groupBox_3)
        self.textEdit.setEnabled(False)
        self.textEdit.setMinimumSize(QtCore.QSize(250, 100))
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        font.setKerning(True)
        self.textEdit.setFont(font)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout_4.addWidget(self.textEdit)
        self.verticalLayout.addWidget(self.groupBox_3)
        self.groupBox_4 = QtWidgets.QGroupBox(self.groupBox)
        self.groupBox_4.setTitle("")
        self.groupBox_4.setObjectName("groupBox_4")
        self.gridLayout = QtWidgets.QGridLayout(self.groupBox_4)
        self.gridLayout.setObjectName("gridLayout")
        self.btn_cls = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_cls.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_cls.setFont(font)
        self.btn_cls.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_cls.setObjectName("btn_cls")
        self.gridLayout.addWidget(self.btn_cls, 0, 0, 1, 1)
        self.btn_back_space = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_back_space.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_back_space.setFont(font)
        self.btn_back_space.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_back_space.setObjectName("btn_back_space")
        self.gridLayout.addWidget(self.btn_back_space, 0, 1, 1, 1)
        self.btn_cf = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_cf.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_cf.setFont(font)
        self.btn_cf.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_cf.setObjectName("btn_cf")
        self.gridLayout.addWidget(self.btn_cf, 0, 2, 1, 1)
        self.btn_kf = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_kf.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_kf.setFont(font)
        self.btn_kf.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_kf.setObjectName("btn_kf")
        self.gridLayout.addWidget(self.btn_kf, 0, 3, 1, 1)
        self.btn_7 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_7.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_7.setFont(font)
        self.btn_7.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_7.setObjectName("btn_7")
        self.gridLayout.addWidget(self.btn_7, 1, 0, 1, 1)
        self.btn_8 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_8.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_8.setFont(font)
        self.btn_8.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_8.setObjectName("btn_8")
        self.gridLayout.addWidget(self.btn_8, 1, 1, 1, 1)
        self.btn_9 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_9.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_9.setFont(font)
        self.btn_9.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_9.setObjectName("btn_9")
        self.gridLayout.addWidget(self.btn_9, 1, 2, 1, 1)
        self.btn_multiply = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_multiply.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_multiply.setFont(font)
        self.btn_multiply.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_multiply.setObjectName("btn_multiply")
        self.gridLayout.addWidget(self.btn_multiply, 1, 3, 1, 1)
        self.btn_4 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_4.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_4.setFont(font)
        self.btn_4.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_4.setObjectName("btn_4")
        self.gridLayout.addWidget(self.btn_4, 2, 0, 1, 1)
        self.btn_5 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_5.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_5.setFont(font)
        self.btn_5.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_5.setObjectName("btn_5")
        self.gridLayout.addWidget(self.btn_5, 2, 1, 1, 1)
        self.btn_6 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_6.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_6.setFont(font)
        self.btn_6.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_6.setObjectName("btn_6")
        self.gridLayout.addWidget(self.btn_6, 2, 2, 1, 1)
        self.btn_divide = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_divide.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_divide.setFont(font)
        self.btn_divide.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_divide.setObjectName("btn_divide")
        self.gridLayout.addWidget(self.btn_divide, 2, 3, 1, 1)
        self.btn_1 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_1.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_1.setFont(font)
        self.btn_1.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_1.setObjectName("btn_1")
        self.gridLayout.addWidget(self.btn_1, 3, 0, 1, 1)
        self.btn_2 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_2.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_2.setFont(font)
        self.btn_2.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_2.setObjectName("btn_2")
        self.gridLayout.addWidget(self.btn_2, 3, 1, 1, 1)
        self.btn_3 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_3.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_3.setFont(font)
        self.btn_3.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_3.setObjectName("btn_3")
        self.gridLayout.addWidget(self.btn_3, 3, 2, 1, 1)
        self.btn_add = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_add.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_add.setFont(font)
        self.btn_add.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_add.setObjectName("btn_add")
        self.gridLayout.addWidget(self.btn_add, 3, 3, 1, 1)
        self.btn_0 = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_0.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_0.setFont(font)
        self.btn_0.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_0.setObjectName("btn_0")
        self.gridLayout.addWidget(self.btn_0, 4, 0, 1, 1)
        self.btn_point = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_point.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_point.setFont(font)
        self.btn_point.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_point.setObjectName("btn_point")
        self.gridLayout.addWidget(self.btn_point, 4, 1, 1, 1)
        self.btn_dy = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_dy.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_dy.setFont(font)
        self.btn_dy.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_dy.setObjectName("btn_dy")
        self.gridLayout.addWidget(self.btn_dy, 4, 2, 1, 1)
        self.btn_sub = QtWidgets.QPushButton(self.groupBox_4)
        self.btn_sub.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.btn_sub.setFont(font)
        self.btn_sub.setStyleSheet("image:url(:/img/images/btn.png);\n"
"border: none;\n"
"color:rgb(255, 255, 255)")
        self.btn_sub.setObjectName("btn_sub")
        self.gridLayout.addWidget(self.btn_sub, 4, 3, 1, 1)
        self.verticalLayout.addWidget(self.groupBox_4)
        self.verticalLayout.setStretch(0, 1)
        self.verticalLayout.setStretch(1, 2)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_3.addWidget(self.groupBox)
        self.verticalLayout_3.setStretch(0, 3)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "简易计算器"))
        self.textEdit.setMarkdown(_translate("Form", "**0**\n"
"\n"
""))
        self.textEdit.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:16pt; font-weight:600; font-style:normal;\">\n"
"<p style=\" margin-top:6px; margin-bottom:6px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">0</p></body></html>"))
        self.btn_cls.setText(_translate("Form", "CLS"))
        self.btn_back_space.setText(_translate("Form", "del"))
        self.btn_cf.setText(_translate("Form", "^"))
        self.btn_kf.setText(_translate("Form", "√"))
        self.btn_7.setText(_translate("Form", "7"))
        self.btn_8.setText(_translate("Form", "8"))
        self.btn_9.setText(_translate("Form", "9"))
        self.btn_multiply.setText(_translate("Form", "*"))
        self.btn_4.setText(_translate("Form", "4"))
        self.btn_5.setText(_translate("Form", "5"))
        self.btn_6.setText(_translate("Form", "6"))
        self.btn_divide.setText(_translate("Form", "/"))
        self.btn_1.setText(_translate("Form", "1"))
        self.btn_2.setText(_translate("Form", "2"))
        self.btn_3.setText(_translate("Form", "3"))
        self.btn_add.setText(_translate("Form", "+"))
        self.btn_0.setText(_translate("Form", "0"))
        self.btn_point.setText(_translate("Form", "."))
        self.btn_dy.setText(_translate("Form", "="))
        self.btn_sub.setText(_translate("Form", "-"))
import res_rc #图片等资源编译为py的文件

逻辑处理代码

# @Author:clc
# @Time:2020-12-22 19:46
# @File:myWidget.py.py
import sys

from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import QApplication, QWidget

from com_qss import CommonHelper
from upy.ui_widget import Ui_Form


class MyWidget(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.ui.textEdit.moveCursor(QTextCursor.End)  # 光标移到最末尾

        self.solt_connect()

    def solt_connect(self):
        self.ui.btn_0.clicked.connect(self.set_data)
        self.ui.btn_1.clicked.connect(self.set_data)
        self.ui.btn_2.clicked.connect(self.set_data)
        self.ui.btn_3.clicked.connect(self.set_data)
        self.ui.btn_4.clicked.connect(self.set_data)
        self.ui.btn_5.clicked.connect(self.set_data)
        self.ui.btn_6.clicked.connect(self.set_data)
        self.ui.btn_7.clicked.connect(self.set_data)
        self.ui.btn_8.clicked.connect(self.set_data)
        self.ui.btn_9.clicked.connect(self.set_data)
        self.ui.btn_point.clicked.connect(self.set_data)

        self.ui.btn_cf.clicked.connect(self.set_data)  # 乘方
        self.ui.btn_kf.clicked.connect(self.set_data)  # 开方

        self.ui.btn_add.clicked.connect(self.set_data)  # +
        self.ui.btn_sub.clicked.connect(self.set_data)  # -
        self.ui.btn_multiply.clicked.connect(self.set_data)  # *
        self.ui.btn_divide.clicked.connect(self.set_data)  # /

        self.ui.btn_dy.clicked.connect(self.set_data)  # =

        self.ui.btn_cls.clicked.connect(self.set_cls)  # cls,归零
        self.ui.btn_back_space.clicked.connect(self.back_space)  # <--

    def set_data(self):
        data = self.sender().text()
        if data in [str(i) for i in range(10)]:
            self.is_zero_start()
            self.ui.textEdit.insertPlainText(data)
            self.ui.textEdit.moveCursor(QTextCursor.End)
        elif data == '.':
            self.is_zero_start()
            is_add = self.is_have_point()
            if is_add == 1:  # 当前数值没有小数点,可加入
                self.ui.textEdit.insertPlainText(data)
                self.ui.textEdit.moveCursor(QTextCursor.End)
            elif is_add == 0:  # 已有小数点,不做处理
                pass
            else:  # 没有任何值,输入小数点前先加0 --> 0.
                self.ui.textEdit.insertPlainText('0' + data)
                self.ui.textEdit.moveCursor(QTextCursor.End)
        elif data in ['*', '/', '+', '-', '^', '√']:
            is_con = self.jisuan()
            if is_con:
                self.ui.textEdit.append(data)
                self.ui.textEdit.append('')
                self.ui.textEdit.moveCursor(QTextCursor.End)
        elif data == '=':
            self.jisuan()

    def is_have_point(self):
        # 判断是否能输入小数点
        text = self.ui.textEdit.toPlainText()
        print('text', text)
        data_list = text.split('\n')
        end_row = data_list[-1]
        if end_row:
            if '.' in end_row:
                return 0
            else:
                return 1
        else:
            return 2

    def set_cls(self):
        # 归零,清除全部,设值为0
        self.ui.textEdit.clear()
        self.ui.textEdit.append(str(0))

    def back_space(self):
        # 删除最后的字符
        all_str = self.ui.textEdit.toPlainText()
        if all_str[-1] == '\n':  # 以换行结尾则不做处理
            return
        cursor = self.ui.textEdit.textCursor()
        cursor.deletePreviousChar()

    def is_zero_start(self):
        # 输入数值时判断是否是0开头,如果是,则回退一个字符
        text = self.ui.textEdit.toPlainText()
        if text:
            data_list = text.split('\n')
            end_row = data_list[-1]
            if end_row == '0':
                self.back_space()

    def jisuan(self):
        text = self.ui.textEdit.toPlainText()
        # print(text)
        if text:
            data_list = text.strip().split('\n')
            # print(data_list)
        else:
            data_list = []
        try:
            if not data_list:
                return False
            if len(data_list) == 1:
                return True
            elif len(data_list) == 2:
                data = data_list[0]
                self.ui.textEdit.setText(data)
                return True
            elif len(data_list) == 3:
                num_1 = float(data_list[0])
                num_2 = float(data_list[-1])
                calculation = data_list[1]
                if calculation == '*':
                    res = num_1 * num_2
                elif calculation == '/':
                    res = num_1 / num_2
                elif calculation == '+':
                    res = num_1 + num_2
                elif calculation == '-':
                    res = num_1 - num_2
                elif calculation == '^':
                    res = num_1 ** num_2
                else:
                    # calculation == '√'
                    res = pow(num_1, 1 / num_2)
                self.ui.textEdit.setPlainText(str(res))
                self.ui.textEdit.moveCursor(QTextCursor.End)
                return True
        except Exception:
            pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = MyWidget()
    # 加载qss文件的样式
    # style_file = './qss/style.qss'
    # qss_style = CommonHelper().read_qss(style_file)
    # form.setStyleSheet(qss_style)

    form.show()
    sys.exit(app.exec_())

展示效果

在这里插入图片描述

源码链接

网盘链接: https://pan.baidu.com/s/1Cuih8ek2OeXxb9gmW-giPA.
提取码: uaah

CSDN资源链接: https://download.csdn.net/download/weixin_43868038/15011546.

----------------------------------------------------------------------------------------------

逻辑处理部分,第98——100行是后面新加的,所以源码里没加上,只在本页面加入了,下载源码后可自行加入

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值