PyQt5-Calculator

      基于PyQt5的计算器界面实现,功能实现和界面实现的组合。计算器可以实现基本的加减乘除运算,通过操作界面中的对应数字进行计算。在界面程序中通过QPushButton和QGridLayout来实现界面的按键,通过QLineEdit来实现数字的输入,通过addWeight加载到QGridLayout上面显示出来。通过定义不同的按键功能实现不同的数据操作调用,定义了def Calculator(self):函数来实现计算器的主要功能实现,其他详细请阅读以下程序。

      计算器界面整个程序运行代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from PyQt5.QtWidgets import QWidget,QPushButton,QLineEdit,QGridLayout,QMessageBox,QApplication
from PyQt5.QtCore import Qt,QSize
from PyQt5.QtGui import QFont

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

        self.move(300,150)
        self.setWindowTitle("Calculator")
        self.show()

    def initUI(self):

        self.string = ''
        self.number = '0'
        self.out='0'

        grid = QGridLayout()
        self.display = QLineEdit('0')

        self.display.setFont(QFont("Times", 20))  # 设置字体
        self.display.setReadOnly(True)  # 设置可编辑
        self.display.setAlignment(Qt.AlignRight)  # 设置文本位置,这里设置为右边开始
        self.display.setMaxLength(50)  # 设置最大的长度
        grid.addWidget(self.display, 0, 0, 1, 4)

        names = ['Clear', 'Del', '(', ')',
                '7', '8', '9', '/',
                '4', '5', '6', '*',
                '1', '2', '3', '-',
                '0', '.', '=', '+']
        pos = [(0, 0), (0, 1), (0, 2), (0, 3),
                (1, 0), (1, 1), (1, 2), (1, 3),
                (2, 0), (2, 1), (2, 2), (2, 3),
                (3, 0), (3, 1), (3, 2), (3, 3 ),
                (4, 0), (4, 1), (4, 2), (4, 3)]

        c = 0
        for name in names:
            """遍历names并将names载入button"""
            button = QPushButton(name)
            #按键大小设置
            button.setFixedSize(QSize(60,30))
            # 给每个按钮设置信号/槽
            button.clicked.connect(self.Calculator)
            #通过调用pos排好的位置确定图形按键位置
            grid.addWidget(button, pos[c][0]+1, pos[c][1])
            c=c+1
        self.setLayout(grid)

    def Calculator(self):
        """显示计算程序"""
        text=self.sender().text()
        #print(text)

        if text=="Del":#切片,按一次减少一位
            self.string=self.number
            self.number=self.number[:-1]

        elif text=="Clear":#置0
            self.number='0'

        elif text=="=":#如果输入等号计算
            print("需要计算的数字字符串",self.number)
            self.out=calculate(self.number)
            self.out=self.out[:12]
            self.number='0'
            print(self.out)

        else:#其他情况下,对字符进行累加
            if (self.number=='0'):
                self.number=''
            self.number=self.number+text
            print(self.number)

        #满足不同条件下的不同显示
        while self.number == '0' and self.out!='0':
            self.display.setText(self.out)
            break
        while self.number != '0' or text=='Clear':
            self.display.setText(self.number)
            break

    def closeEvent(self,event):
        """关闭程序"""
        reply=QMessageBox.question(self,"Message","Are you sure to quit?",
                                   QMessageBox.Yes,QMessageBox.No)
        if reply==QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def refresh_formula(formula):
    """处理同号得正异号得负"""
    formula = formula.replace(" ","")
    formula = formula.replace("+-","-")
    formula = formula.replace("-+","-")
    formula = formula.replace("--","+")
    return formula




def total_calc(formula):

    def devide(formula):
        """"""
        devidestr = re.search('\d+\.?\d*(\/-?\d+\.?\d*)+', formula)
        if devidestr is None:
            return formula
        devidenum = re.findall('-?\d+\.?\d*', devidestr.group())
        devidelist = []
        for i in devidenum:
            devidelist.append(float(i))
        res = devidelist[0]
        for i in range(1, len(devidelist)):
            res = res / devidelist[i]
        formula = re.sub('\d+\.?\d*(\/-?\d+\.?\d*)+', str(res), formula, 1)
        return formula

    def multiply(formula):
        """"""
        multiplystr = re.search('\d+\.?\d*(\*-?\d+\.?\d*)+', formula)
        if multiplystr is None:
            return formula
        multiplynum = re.findall(r'-?\d+\.?\d*', multiplystr.group())
        multiplylist = []
        res = 1
        for i in multiplynum:
            multiplylist.append(float(i))
        for i in range(len(multiplylist)):
            res = res * multiplylist[i]
        formula = re.sub(r'\d+\.?\d*(\*-?\d+\.?\d*)+', str(res), formula, 1)
        return formula

    formula = refresh_formula(formula)
    res = 0
    while True:

        if '*' in formula:
            mul = formula.split("*")
            #print("mul",mul)
            if '/' in mul[0]:
                formula = devide(formula)
                #print("devide",formula)
            else:
                formula = multiply(formula)
                #print("multiply",formula)

        elif '/' in formula:
            formula = devide(formula)


        elif '+' or '-' in formula:#加减运算
            addminus = re.findall('-?\d+\.?\d*',formula)
            #print("addminus",addminus)
            res = 0
            for digit in addminus:
                res = res + float(digit)
            return str(res)

        else:
            return res

def bracket_calc(bracketstr):
    """去括号运算"""
    bracketstr = bracketstr.replace("\(","")
    bracketstr = bracketstr.replace("\)","")
    return total_calc(bracketstr)

def calculate(formula):
    while True:
        #运算优先级查找
        bracket = re.search("\(([^()]+)\)",formula)
        # print("formula",formula)
        # print("bracket",bracket)
        """有括号先计算括号里面的,bracket_calc(bracket),
        没有括号按照优先级进行计算,total_calc(formula)"""
        if bracket:
            bracket = bracket.group()
            #print("BRACK",bracket)
            res = bracket_calc(bracket)
            #print("()result is:%s" % res)
            formula = formula.replace(bracket,res)
        else:
            res = total_calc(formula)
            print("result is %s" % res)
            return res

if __name__=="__main__":
    app=QApplication(sys.argv)
    ex=Example()
    sys.exit(app.exec_())

计算器功能参考https://blog.csdn.net/later_fall/article/details/77444204

猜你喜欢

转载自blog.csdn.net/zx520113/article/details/80272809