基于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