PYQT制作简易计算器
PYQT制作计算器
- 一、项目制作各部分构思
- 1、Qt界面
- 2、数字输入
- 3、运算
- 4、删除
- 5、窗体伸缩
- 6、键盘控制
- 二、代码展示
本人目前是只是一名普通在校大学生,在大二第一学期开设的课程里接触到Python语言与pyqt。本文章所写内容,为本人在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换为1b='1'else: b = self.labNumber1.text() + '1'self.labNumber1.setText(str(b))
def Point(self):a=self.labNumber1.text()if a=='':#如果a为空,则退出函数returna = 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=='':returnd=float(a)c = b + a + '+'self.labNumber2.setText(c)self.labNumber1.setText("")global Aif b=='':A=dreturnif 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:returnA=float(A/d)
def Equality(self):#计算最终结果a=self.labNumber2.text()o=self.labNumber1.text()if a=='' and o=='':#如果两个标签显示都为空,则退出函数returnif a=='' and o!="":#如果labnumber2为空,labNumber1不为空,则输出结果为labNumber1c=float(o)returnb=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=='':#如果两个标签显示都为空,则退出函数returnif a=='' and o!="":#如果labnumber2为空,labNumber1不为空,则输出结果为labNumber1c=float(o)returnb=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=='':returnif 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()
event.key()的作用是获取键盘事件。
实现此功能是用的库为pyqt5中自带的QtCore,除此以外,大家也可以使用pygame库编写。
以上就是我在本次项目设计中,对各部分的构思,此计算器还存在很多不足,比如:未解决计算优先级的问题。
二、代码展示
下面为本次项目所编写的全部代码:
# 系统包
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=='':returna = self.labNumber1.text() + '.'self.labNumber1.setText(str(a))def Add(self):#加法a =self.labNumber1.text()b =self.labNumber2.text()if a=='':returnd=float(a)c = b + a + '+'self.labNumber2.setText(c)self.labNumber1.setText("")global Aif b=='':A=dreturnif 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:returnA=float(A/d)def Subtract(self):#减法a =self.labNumber1.text()b =self.labNumber2.text()if a=='':returnd=float(a)c = b + a + '-'self.labNumber2.setText(c)self.labNumber1.setText("")global Aif b=='':A=dreturnif 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:returnA=float(A/d)def Multiply(self):#乘法a =self.labNumber1.text()b =self.labNumber2.text() if a=='':returnd=float(a) c = b + a + '×'self.labNumber2.setText(c)self.labNumber1.setText("")global Aglobal Bif b=='':A=dreturnif 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:returnA=float(A/d)def Divide(self):#除法a =self.labNumber1.text()b =self.labNumber2.text()if a=='':returnd=float(a)c = b + a + '÷'self.labNumber2.setText(c)self.labNumber1.setText("")global Aif b=='':A=dreturnif 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:returnA=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:#该函数不与加减乘除进行连续计算returnif a=='':returnb = 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:returnif a=='':returnb = 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:returnb=1/aself.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:returnif a=='':returnb = 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:returnif a=='':returnb = a + "log"self.labNumber2.setText(b)self.labNumber1.setText("")def Backspace(self):#退格a=self.labNumber1.text()if a=='':returnif 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=='':returnif a=='' and o!="":c=float(o)returnb=float(self.labNumber1.text())if o=='':b=0else: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:returnc=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:returnc=math.asin(b) if a=="Arccos":if b>1 or b<-1:returnc=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_())
感谢各位的阅读,欢迎各位指正。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
