PYQT制作简易计算器

本人目前是只是一名普通在校大学生,在大二第一学期开设的课程里接触到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换为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()

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=='':
            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_())

感谢各位的阅读,欢迎各位指正。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用PyQt5可以很方便地实现简易计算器的功能。以下是实现简易计算器的步骤: 1. 导入PyQt5模块和sys模块。 2. 创建一个QApplication对象。 3. 创建一个QWidget对象作为主窗口。 4. 创建一个QLineEdit对象用于显示计算结果。 5. 创建多个QPushButton对象作为数字和运算符按钮,并将它们添加到主窗口中。 6. 为每个按钮连接一个槽函数,用于处理按钮点击事件。 7. 在槽函数中,根据按钮的文本内容进行相应的计算,并将结果显示在QLineEdit对象中。 下面是一个简单的示例代码: ``` import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout class Calculator(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.result = QLineEdit() self.result.setReadOnly(True) vbox = QVBoxLayout() vbox.addWidget(self.result) grid = QGridLayout() self.buttons = {} button_texts = ['7', '8', '9', '+', '4', '5', '6', '-', '1', '2', '3', '*', '0', '.', '=', '/'] positions = [(i, j) for i in range(4) for j in range(4)] for position, text in zip(positions, button_texts): button = QPushButton(text) self.buttons[text] = button grid.addWidget(button, *position) vbox.addLayout(grid) self.setLayout(vbox) for text, button in self.buttons.items(): if text.isdigit() or text == '.': button.clicked.connect(self.handle_digit) elif text in ['+', '-', '*', '/']: button.clicked.connect(self.handle_operator) elif text == '=': button.clicked.connect(self.handle_equal) self.setWindowTitle('Calculator') self.show() def handle_digit(self): button = self.sender() digit = button.text() self.result.setText(self.result.text() + digit) def handle_operator(self): button = self.sender() operator = button.text() self.result.setText(self.result.text() + ' ' + operator + ' ') def handle_equal(self): expression = self.result.text() try: result = eval(expression) self.result.setText(str(result)) except: self.result.setText('Error') if __name__ == '__main__': app = QApplication(sys.argv) calc = Calculator() sys.exit(app.exec_()) ``` 相关问题: 1. 如何在PyQt5中创建主窗口? 2. 如何在PyQt5中创建按钮并连接槽函数? 3. 如何在PyQt5中显示文本框?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值