PyQt5-Calculator
阿新 • • 發佈:2018-11-10
基於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