用Python编写简单计算器功能
大家好,小编来为大家解答以下问题,用python做简单的计算器,python编写简单计算器,现在让我们一起来看看吧!
原文链接:PYQT制作简易计算器_pyqt5 简易计算器-CSDN博客
本人目前是只是一名普通在校大学生,在大二第一学期开设的课程里接触到Python语言与pyqt。本文章所写内容,为本人在Python课程结课考察中所做的小项目——计算器python创意小作品代码。此计算器的设计参考了win10系统自带的计算器与安卓系统手机计算器。
另外,本人并非计算机系学生,所以本文章或许会有许多不合理或不专业之处,还望各位大佬指正。
一、项目制作各部分构思
这一部分,我将为大家介绍,我在制作计算器时各方面的想法与构思。大致可分为以下几个内容:Qt界面、运算、删除、窗体伸缩、键盘控制。
1、Qt界面
本项目所设计的计算器的Qt界面大体如下:
在此计算器的显示部分,为了美观我使用了一个多行文本框(Text Edit),将其设置为只读(readOnly),并将两个标签(Label)覆盖其上,用两行标签来显示计算器计算内容。
代码如下:
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(40, 30, 431, 111))
self.textEdit.setReadOnly(True)
self.textEdit.setObjectName("textEdit")
self.labNumber1 = QtWidgets.QLabel(self.centralwidget)
self.labNumber1.setGeometry(QtCore.QRect(40, 90, 431, 51))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.labNumber1.setFont(font)
self.labNumber1.setText("")
self.labNumber1.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labNumber1.setObjectName("labNumber1")
self.labNumber2 = QtWidgets.QLabel(self.centralwidget)
self.labNumber2.setGeometry(QtCore.QRect(200, 30, 271, 61))
font = QtGui.QFont()
font.setPointSize(13)
self.labNumber2.setFont(font)
self.labNumber2.setText("")
self.labNumber2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labNumber2.setObjectName("labNumber2")
以上代码存在于Ui-MainWindow.py中,属于使用desinger设计内容,下面文章内容不会出现此部分代码。
2、数字输入
以数字1与小数点为例,代码如下:
def One(self):
a=self.labNumber1.text()
if a=='0':#如果当前a的值为0,则将0换为1
b='1'
else:
b = self.labNumber1.text() + '1'
self.labNumber1.setText(str(b))
def Point(self):
a=self.labNumber1.text()
if a=='':#如果a为空,则退出函数
return
a = self.labNumber1.text() + '.'
self.labNumber1.setText(str(a))
3、运算
运算逻辑如下图所示:
计算器中的运算模式为:上一级运算交由下一级运算符计算,下一级运算由更下一级运算。
例如:1+2-3=0。按照正常的思维逻辑,我们应先计算1+2,得到结果3,再用所得结果减掉最后的3,最后结果为0。而此次项目的运算思维略有不同,当+号触发时,计算器并不会进行计算,只是将加数1保存下来,等到-号触发时,计算器才会计算出1+2=3,以此类推。
具体程序(以加法为例)如下:
def Add(self):#加法
a =self.labNumber1.text()
b =self.labNumber2.text()
if a=='':
return
d=float(a)
c = b + a + '+'
self.labNumber2.setText(c)
self.labNumber1.setText("")
global A
if b=='':
A=d
return
if b[-1]=="+":
A=float(A+d)
if b[-1]=="-":
A=float(A-d)
if b[-1]=="×":
A=float(A*d)
if b[-1]=="÷":
if d==0:
return
A=float(A/d)
def Equality(self):#计算最终结果
a=self.labNumber2.text()
o=self.labNumber1.text()
if a=='' and o=='':#如果两个标签显示都为空,则退出函数
return
if a=='' and o!="":#如果labnumber2为空,labNumber1不为空,则输出结果为labNumber1
c=float(o)
return
b=float(self.labNumber1.text())
if a[-1]=="+":
c=float(A+b)
if c % 1 == 0 :#判断结果是否为整数
d=int(c)
self.labNumber1.setText(str(d))
else:
self.labNumber1.setText(str(c))
self.labNumber2.setText('')
函数中定义全局变量A,使用A获取计算每一步的出的结果。然后后一位的运算符激活时,获取A的值,进行下一步计算。
此计算器除基础的加减乘除以外,还可以计算的函数有:三角函数、反三角函数、反比例函数、对数函数。而这一部分的我们可以调用math库中的函数进行计算。以正弦函数为例,代码如下:
def Sin(self):
self.labNumber2.setText("sin")
def Equality(self):
a=self.labNumber2.text()
o=self.labNumber1.text()
if a=='' and o=='':#如果两个标签显示都为空,则退出函数
return
if a=='' and o!="":#如果labnumber2为空,labNumber1不为空,则输出结果为labNumber1
c=float(o)
return
b=float(self.labNumber1.text())
if a=="sin":
c=math.sin(b)
if c % 1 == 0 :#判断结果是否为整数
d=int(c)
self.labNumber1.setText(str(d))
else:
self.labNumber1.setText(str(c))
self.labNumber2.setText('')
4、删除
在此计算器中共有两种删除模式:退格(backspace)和清空(clear)。退格的删除方式可以将labNumber1框里的内容从右往左依次删除,清空的方式可以将labNumber1与labNumber2中所有的内容删除。
两种删除模式代码分别如下:
退格:
def Backspace(self):#退格
a=self.labNumber1.text()
if a=='':
return
if a!='':
u = a[0:-1]
self.labNumber1.setText(str(u))
清空:
def Delete(self):#删除全部
self.labNumber1.setText('')
self.labNumber2.setText('')
5、窗体伸缩
在本次项目中,我通过运用改变框体大小方法,制作出了一个较为简易的隐藏功能,用一个按钮控制。
在这个功能里,我所使用的函数为MainWindow.resize(x,y)。x为框体的长,y为框体的宽。代码如下:
def Flex(self):
a=self.butFlex.text()
if a=='▷':#显示内容
MainWindow.resize(900, 570)
self.butFlex.setText("◁")
if a=='◁':#隐藏内容
MainWindow.resize(544, 568)
self.butFlex.setText("▷")
6、键盘控制
此计算器除使用鼠标点击控制外,还可以使用键盘进行简单的一些控制。通过触发不同的按键,调用相对应的函数(函数在此前已经编写完成),以数字1为例,代码如下:
def keyPressEvent(self, event):
if event.key() == Qt.Key_1:
self.One()
7、代码展示
下面为本次项目所编写的全部代码:
# 系统包
import sys
#数学模块
import math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
# 项目包
from Ui_MainWindow import Ui_MainWindow
class CMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent = None):
super(CMainWindow, self).__init__(parent)
self.setupUi(self)
# 主窗体设置
self.show()
def Flex(self):
a=self.butFlex.text()
if a=='▷':
MainWindow.resize(900, 570)
self.butFlex.setText("◁")
if a=='◁':
MainWindow.resize(544, 568)
self.butFlex.setText("▷")
def One(self):
a=self.labNumber1.text()
if a=='0':
b='1'
else:
b = self.labNumber1.text() + '1'
self.labNumber1.setText(str(b))
def Two(self):
a=self.labNumber1.text()
if a=='0':
b='2'
else:
b = self.labNumber1.text() + '2'
self.labNumber1.setText(str(b))
def Three(self):
a=self.labNumber1.text()
if a=='0':
b='3'
else:
b = self.labNumber1.text() + '3'
self.labNumber1.setText(str(b))
def Four(self):
a=self.labNumber1.text()
if a=='0':
b='4'
else:
b = self.labNumber1.text() + '4'
self.labNumber1.setText(str(b))
def Five(self):
a=self.labNumber1.text()
if a=='0':
b='5'
else:
b = self.labNumber1.text() + '5'
self.labNumber1.setText(str(b))
def Six(self):
a=self.labNumber1.text()
if a=='0':
b='6'
else:
b = self.labNumber1.text() + '6'
self.labNumber1.setText(str(b))
def Seven(self):
a=self.labNumber1.text()
if a=='0':
b='7'
else:
b = self.labNumber1.text() + '7'
self.labNumber1.setText(str(b))
def Eight(self):
a=self.labNumber1.text()
if a=='0':
b='8'
else:
b = self.labNumber1.text() + '8'
self.labNumber1.setText(str(b))
def Nine(self):
a=self.labNumber1.text()
if a=='0':
b='9'
else:
b = self.labNumber1.text() + '9'
self.labNumber1.setText(str(b))
def Zero(self):
a=self.labNumber1.text()
if a=='0':
b='9'
else:
b = self.labNumber1.text() + '0'
self.labNumber1.setText(str(b))
def Point(self):
a=self.labNumber1.text()
if a=='':
return
a = self.labNumber1.text() + '.'
self.labNumber1.setText(str(a))
def Add(self):#加法
a =self.labNumber1.text()
b =self.labNumber2.text()
if a=='':
return
d=float(a)
c = b + a + '+'
self.labNumber2.setText(c)
self.labNumber1.setText("")
global A
if b=='':
A=d
return
if b[-1]=="+":
A=float(A+d)
if b[-1]=="-":
A=float(A-d)
if b[-1]=="×":
A=float(A*d)
if b[-1]=="÷":
if d==0:
return
A=float(A/d)
def Subtract(self):#减法
a =self.labNumber1.text()
b =self.labNumber2.text()
if a=='':
return
d=float(a)
c = b + a + '-'
self.labNumber2.setText(c)
self.labNumber1.setText("")
global A
if b=='':
A=d
return
if b[-1]=="+":
A=float(A+d)
if b[-1]=="-":
A=float(A-d)
if b[-1]=="×":
A=float(A*d)
if b[-1]=="÷":
if d==0:
return
A=float(A/d)
def Multiply(self):#乘法
a =self.labNumber1.text()
b =self.labNumber2.text()
if a=='':
return
d=float(a)
c = b + a + '×'
self.labNumber2.setText(c)
self.labNumber1.setText("")
global A
global B
if b=='':
A=d
return
if b[-1]=="+":
A=float(A+d)
if b[-1]=="-":
A=float(A-d)
if b[-1]=="×":
A=float(A*d)
if b[-1]=="÷":
if d==0:
return
A=float(A/d)
def Divide(self):#除法
a =self.labNumber1.text()
b =self.labNumber2.text()
if a=='':
return
d=float(a)
c = b + a + '÷'
self.labNumber2.setText(c)
self.labNumber1.setText("")
global A
if b=='':
A=d
return
if b[-1]=="+":
A=float(A+d)
if b[-1]=="-":
A=float(A-d)
if b[-1]=="×":
A=float(A*d)
if b[-1]=="÷":
if d==0:
return
A=float(A/d)
def Sin(self):
self.labNumber2.setText("sin")
def Cos(self):
self.labNumber2.setText("cos")
def Tan(self):
self.labNumber2.setText("tan")
def Arcsin(self):
self.labNumber2.setText("Arcsin")
def Arccos(self):
self.labNumber2.setText("Arccos")
def Arctan(self):
self.labNumber2.setText("Arctan")
def Rem(self):#取余
a =self.labNumber1.text()
c =self.labNumber2.text()
if '+' in c or '-' in c or '×' in c or '÷' in c:#该函数不与加减乘除进行连续计算
return
if a=='':
return
b = a + "%"
self.labNumber2.setText(b)
self.labNumber1.setText("")
def Root(self):#开根
a =self.labNumber1.text()
c =self.labNumber2.text()
if '+' in c or '-' in c or '×' in c or '÷' in c:
return
if a=='':
return
b = a + "√"
self.labNumber2.setText(b)
self.labNumber1.setText("")
def Special(self):#反比例函数
a=float(self.labNumber1.text())
c =self.labNumber2.text()
if '+' in c or '-' in c or '×' in c or '÷' in c:
return
b=1/a
self.labNumber1.setText(str(b))
def Involution(self):#乘方
a =self.labNumber1.text()
c =self.labNumber2.text()
if '+' in c or '-' in c or '×' in c or '÷' in c:
return
if a=='':
return
b = a + "^"
self.labNumber2.setText(b)
self.labNumber1.setText("")
def Log(self):#对数函数
a =self.labNumber1.text()
c =self.labNumber2.text()
if '+' in c or '-' in c or '×' in c or '÷' in c:
return
if a=='':
return
b = a + "log"
self.labNumber2.setText(b)
self.labNumber1.setText("")
def Backspace(self):#退格
a=self.labNumber1.text()
if a=='':
return
if a!='':
u = a[0:-1]
self.labNumber1.setText(str(u))
def Delete(self):#删除全部
self.labNumber1.setText('')
self.labNumber2.setText('')
def Equality(self):
a=self.labNumber2.text()
o=self.labNumber1.text()
if a=='' and o=='':
return
if a=='' and o!="":
c=float(o)
return
b=float(self.labNumber1.text())
if o=='':
b=0
else:
b=float(self.labNumber1.text())
if a[-1]=='+' or a[-1] == '-' or a[-1] == '×' or a[-1] == '÷' :
c=float(A)
if a[-1]=="+":
c=float(A+b)
if a[-1]=="-":
c=float(A-b)
if a[-1]=="×":
c=float(A*b)
if a[-1]=="÷":
if b==0:
return
c=float(A/b)
if a[-1] == '%':
c = float(a[0:-1]) % b
if a[-1] == '√':
c = float(a[0:-1]) ** (1/b)
if a[-1] == '^':
c = float(a[0:-1]) ** b
if a[-1] == 'g':
d=float(a[0:-3])
c = math.log(b,d)
if a=="sin":
c=math.sin(b)
if a=="cos":
c=math.cos(b)
if a=="tan":
c=math.tan(b)
if a=="Arcsin":
if b>1 or b<-1:
return
c=math.asin(b)
if a=="Arccos":
if b>1 or b<-1:
return
c=math.acos(b)
if a=="Arctan":
c=math.atan(b)
if c % 1 == 0 :
d=int(c)
self.labNumber1.setText(str(d))
else:
self.labNumber1.setText(str(c))
self.labNumber2.setText('')
def keyPressEvent(self, event):
if event.key() == Qt.Key_0:
self.Zero()
if event.key() == Qt.Key_1:
self.One()
if event.key() == Qt.Key_2:
self.Two()
if event.key() == Qt.Key_3:
self.Three()
if event.key() == Qt.Key_4:
self.Four()
if event.key() == Qt.Key_5:
self.Five()
if event.key() == Qt.Key_6:
self.Six()
if event.key() == Qt.Key_7:
self.Seven()
if event.key() == Qt.Key_8:
self.Eight()
if event.key() == Qt.Key_9:
self.Nine()
if event.key() == Qt.Key_Period:
self.Point()
if event.key() == Qt.Key_Plus:
self.Add()
if event.key() == Qt.Key_Minus:
self.Subtract()
if event.key() == Qt.Key_Asterisk:
self.Multiply()
if event.key() == Qt.Key_Slash:
self.Divide()
if event.key() == Qt.Key_Percent:
self.Rem()
if event.key() == Qt.Key_Space:
self.Involution()
if event.key() == Qt.Key_Control:
self.Root()
if event.key() == Qt.Key_Backspace :
self.Backspace()
if event.key() == Qt.Key_D:
self.Delete()
if event.key() == Qt.Key_C:
self.Cos()
if event.key() == Qt.Key_S:
self.Sin()
if event.key() == Qt.Key_T:
self.Tan()
if event.key() == Qt.Key_L :
self.Log()
if event.key() == Qt.Key_Enter:
self.Flex()
if event.key() == Qt.Key_Equal :
self.Equality()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = CMainWindow()
sys.exit(app.exec_())
感谢各位的阅读,欢迎各位指正。
作者:Rtee1