1. 程式人生 > >PyQt5-Calculator

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