Python語言系統學習15:作品——PYQT製作簡易計算器

原文鏈接:https://blog.csdn.net/qq_45595573/article/details/103572468

本人目前是隻是一名普通在校大學生,在大二第一學期開設的課程裏接觸到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()

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_())

感謝各位的閱讀,歡迎各位指正。

 

 

 

 

 

 

 

 

 

 

 

 

發佈了425 篇原創文章 · 獲贊 1116 · 訪問量 84萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章