Bootstrap

基于PyQt5的简易计算器

基于PyQt5的简易计算器之三

提示:基于PyQt5的简易计算器之一为环境搭建
基于PyQt5的简易计算器之一为环境搭建
基于PyQt5的简易计算器之二为Qt Designer使用
基于PyQt5的简易计算器之三为pycharm中实现按键的功能



import 部分

import sys 
# 导入系统,不用对其pip安装
from PyQt5.QtWidgets import QApplication,QWidget 
# 需要pip安装 PyQt5,已在基于PyQt5的简易计算器之一 环境的搭建中实现
from CalcuInterface import Ui_widget 
# 用户自己定义的,为ui转为py文件中的类,已在基于PyQt5的简易计算器之二 Qt Designer 中实现
from PyQt5.QtGui import  QIcon
# 用于加入软件独特的logo

一、创建类

class QmyWidget(QWidget):

# QmyWidget为创建的类名称,可以修改。

二、初始化定义

  def __init__(self,parent = None):  # ==注意init前后两个短线 _ _==
        # 从文件中加载UI定义
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        super().__init__(parent) # 调用父类构造函数,创建QtWidget窗口
        self.label_text = ''  # 定义一个变量,用于存放运算方程
        self.edit_text = ''   # 定义一个变量,用于按键输入的数值和运算符号
        self.num1 = ''        # 定义一个变量,用于存放输入的第一个数
        self.num2 = ''
        self.opt = ''		  # 定义一个变量,用于存放运算符
        self.result = ''	  # 定义一个变量,用于存放运算结果
        self.__ui = Ui_widget() # 创建UI对象
        self.__ui.setupUi(self)  # 创建UI界面
        self.__ui.lineEdit_op.setText('0') #编辑框lineEdit_op初始化,第二个框名称lineEdit_op
        self.__ui.display.setText('0') #结果显示框display初始化,第一个框名称display

三、数字0-9

以3 为例

    def on_three_pressed(self):  # three为按键3 的名称,如之二图中定义按键的名称
        self.label_text += '3'
		# 存放所有的输入,包括此时的输入:3
        if(self.opt == ''): # 若没有输入运算符,则给第一个数值后面
            self.num1 += '3'
            self.edit_text = self.num1 # 将数值1给变量edit_text,为后面在第二个框中显示做铺垫
        else:
            self.num2 += '3' # 若有运算符,则将3 给第二个数值后面
            self.edit_text = self.num2  #  同理
        self.__ui.lineEdit_op.setText(self.edit_text)  # 将输入的数值,显示在第二个框中
        self.__ui.display.setText(self.label_text)	   #将所有的输入,显示在第一个框中

其他数值类似。

四、点

点的功能和数字相似,因此写在这个地方

    def on_point_pressed(self):
        self.label_text += '.'
		# 存放所有的输入,包括此时的输入:3
        if(self.opt == ''): # 若没有输入运算符,则给第一个数值后面
            self.num1 += '.'
            self.edit_text = self.num1 # 将数值1给变量edit_text,为后面在第二个框中显示做铺垫
        else:
            self.num2 += '.'  # 若有运算符,则将3 给第二个数值后面
            self.edit_text = self.num2  #  同理
        self.__ui.lineEdit_op.setText(self.edit_text)  # 将输入的数值,显示在第二个框中
        self.__ui.display.setText(self.label_text)	   #将所有的输入,显示在第一个框中

四、加减乘除

以加为例

    def on_add_pressed(self):
        if (self.num1 == '' or self.opt !=''): # 若第一个数为空,或运算符为空,点击运算符失效
            pass
        else: # 否则
            self.label_text +='+' # 第一个显示屏的变量继续储存
            self.opt = '+'        # 运算符储存 +
            self.__ui.display.setText(self.label_text) # 第一个显示屏显示输入的“第一个数+”的内容,第二个框不做变化,还是第一个数值。

其他类似


五、 等于

    def on_equal_pressed(self):
        if (self.num2 == ''):  # 没有两个数时,等号无效
            pass
        else:
            if(self.opt == '+'):
                self.result = str(float(self.num1) + float(self.num2))
            elif (self.opt == '-'):
                self.result = str(float(self.num1) - float(self.num2))
            elif (self.opt == '×'):
                self.result = str(float(self.num1) * float(self.num2))
            elif (self.opt == '÷'):
                self.result = str(float(self.num1) / float(self.num2))

            self.label_text = self.label_text + '=' +self.result # 将等于号和等于结果给第一个框的变量
            self.edit_text = self.result  # 将结果给第二个框的变量
            self.__ui.lineEdit_op.setText(self.edit_text)  # 在第二个框中显示结果
            self.__ui.display.setText(self.label_text) # 在第一个框中显示方程

# 对以上五个变量初始化。清空所有值。
            self.label_text = ''
            self.edit_text = ''
            self.num1 = ''
            self.num2 = ''
            self.opt = ''
            self.result = ''

六、 清除命令

清除命令较为简单,即等于后面的初始化+ 两个显示屏的清除

   def on_clearall_pressed(self):
        self.__ui.lineEdit_op.clear() # 第二个显示屏的清除
        self.__ui.display.clear()     # 第一个显示屏的清除
        self.label_text = ''
        self.edit_text = ''
        self.num1 = ''
        self.num2 = ''
        self.opt = ''
        self.result = ''

七、 退格命令

输错了,消除掉此次输入错误的一步

#退格
    def on_remove_pressed(self):
        if(self.opt == ''): # 若运算符没有输入时,即第一个数值
            self.num1 = self.num1[0:-1] # 字符串的切片,最后一个字符不要了
            self.edit_text = self.num1  # 修改此时的第二个框的内容
            self.label_text = self.num1 # 修改此时的第一个框的内容

        elif (self.opt != '' and self.num2 == '' ): # 若运算符输入,第二个数值没有输入时,即运算符
            self.opt = ''  # 将运算符清空
            self.label_text = self.label_text[0:-1] # 将第一个框的变量中去掉运算符
        elif(self.num2 != ''): # 若第二个数值不为空,即对第二个数值操作
            self.num2 = self.num2[0:-1]   # 第二个数的字符串最后一个字符不要了
            self.edit_text = self.edit_text[0:-1] # 第二个显示屏的字符串最后一个字符不要了
            self.label_text = self.label_text[0:-1] # 第一个数的字符串最后一个字符不要了
        self.__ui.lineEdit_op.setText(self.edit_text) # 第一个显示屏显示
        self.__ui.display.setText(self.label_text) # 第二个显示屏显示

八、 主程序

以下为固定格式,可以改变的为

  1. QmyWidget(),此类为以上文件定义的类名成。
  2. app.setWindowIcon(QIcon(‘logo.png’)) 可以去掉,用于软件运行时,左上角的logo. 图片随便找个就行。
if __name__ == "__main__":  #固定格式
    app = QApplication(sys.argv)
    # 加载
    app.setWindowIcon(QIcon('logo.png'))

    myWidget = QmyWidget()
    myWidget.show()
    sys.exit(app.exec_())


九、 完整的py文件


import sys
from PyQt5.QtWidgets import QApplication,QWidget
from CalcuInterface import Ui_widget
from PyQt5.QtGui import  QIcon

class QmyWidget(QWidget):
    def __init__(self,parent = None):
        # 从文件中加载UI定义
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        super().__init__(parent) # 调用父类构造函数,创建QtWidget窗口
        self.label_text = ''
        self.edit_text = ''
        self.num1 = ''
        self.num2 = ''
        self.opt = ''
        self.result = ''
        self.__ui = Ui_widget() # 创建UI对象
        self.__ui.setupUi(self)  # 创建UI界面
        self.__ui.lineEdit_op.setText('0') #编辑框lineEdit_op初始化
        self.__ui.display.setText('0') #结果显示框display初始化
#  数字0-9
    def on_zero_pressed(self):  # zero是0的按键名
        self.label_text += '0'

        if(self.opt == ''):
            self.num1 += '0'
            self.edit_text = self.num1
        else:
            self.num2 += '0'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_one_pressed(self):
        self.label_text += '1'

        if(self.opt == ''):
            self.num1 += '1'
            self.edit_text = self.num1
        else:
            self.num2 += '1'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_two_pressed(self):
        self.label_text += '2'

        if(self.opt == ''):
            self.num1 += '2'
            self.edit_text = self.num1
        else:
            self.num2 += '2'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_three_pressed(self):
        self.label_text += '3'

        if(self.opt == ''):
            self.num1 += '3'
            self.edit_text = self.num1
        else:
            self.num2 += '3'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_four_pressed(self):
        self.label_text += '4'

        if(self.opt == ''):
            self.num1 += '4'
            self.edit_text = self.num1
        else:
            self.num2 += '4'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_five_pressed(self):
        self.label_text += '5'

        if(self.opt == ''):
            self.num1 += '5'
            self.edit_text = self.num1
        else:
            self.num2 += '5'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_six_pressed(self):
        self.label_text += '6'

        if(self.opt == ''):
            self.num1 += '6'
            self.edit_text = self.num1
        else:
            self.num2 += '6'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_seven_pressed(self):
        self.label_text += '7'

        if(self.opt == ''):
            self.num1 += '7'
            self.edit_text = self.num1
        else:
            self.num2 += '7'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_eight_pressed(self):
        self.label_text += '8'

        if(self.opt == ''):
            self.num1 += '8'
            self.edit_text = self.num1
        else:
            self.num2 += '8'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    def on_nine_pressed(self):
        self.label_text += '9'

        if(self.opt == ''):
            self.num1 += '9'
            self.edit_text = self.num1
        else:
            self.num2 += '9'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)
    # 附加功能:点号
    def on_point_pressed(self):
        self.label_text += '.'
        if(self.opt == ''):
            self.num1 += '.'
            self.edit_text = self.num1
        else:
            self.num2 += '.'
            self.edit_text = self.num2
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)

    # 加减乘除
    def on_add_pressed(self):
        if (self.num1 == '' or self.opt !=''):
            pass
        else:
            self.label_text +='+'
            self.opt = '+'
            self.__ui.display.setText(self.label_text)

    def on_subtract_pressed(self):
        if (self.num1 == '' or self.opt !=''):
            pass
        else:
            self.label_text +='-'
            self.opt = '-'
            self.__ui.display.setText(self.label_text)

    def on_multiply_pressed(self):
        if (self.num1 == '' or self.opt !=''):
            pass
        else:
            self.label_text +='×'
            self.opt = '×'
            self.__ui.display.setText(self.label_text)

    def on_divid_pressed(self):
        if (self.num1 == '' or self.opt !=''):
            pass
        else:
            self.label_text +='÷'
            self.opt = '÷'
            self.__ui.display.setText(self.label_text)

    # 等于
    def on_equal_pressed(self):
        if (self.num2 == ''):  # 没有两个数时,等号无效
            pass
        else:
            if(self.opt == '+'):
                self.result = str(float(self.num1) + float(self.num2))
            elif (self.opt == '-'):
                self.result = str(float(self.num1) - float(self.num2))
            elif (self.opt == '×'):
                self.result = str(float(self.num1) * float(self.num2))
            elif (self.opt == '÷'):
                self.result = str(float(self.num1) / float(self.num2))

            self.label_text = self.label_text + '=' +self.result
            self.edit_text = self.result
            self.__ui.lineEdit_op.setText(self.edit_text)
            self.__ui.display.setText(self.label_text)
            self.label_text = ''
            self.edit_text = ''
            self.num1 = ''
            self.num2 = ''
            self.opt = ''
            self.result = ''

    # 清除命令
    def on_clearall_pressed(self):
        self.__ui.lineEdit_op.clear()
        self.__ui.display.clear()
        self.label_text = ''
        self.edit_text = ''
        self.num1 = ''
        self.num2 = ''
        self.opt = ''
        self.result = ''

#退格
    def on_remove_pressed(self):
        if(self.opt == ''):
            self.num1 = self.num1[0:-1]
            self.edit_text = self.num1
            self.label_text = self.num1
        elif (self.opt != '' and self.num2 == '' ):
            self.opt = ''
            self.label_text = self.label_text[0:-1]
        elif(self.num2 != ''):
            self.num2 = self.num2[0:-1]
            self.edit_text = self.edit_text[0:-1]
            self.label_text = self.label_text[0:-1]
        self.__ui.lineEdit_op.setText(self.edit_text)
        self.__ui.display.setText(self.label_text)
# 括弧
#     def on_brackets_left_pressed(self):

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 加载
    app.setWindowIcon(QIcon('logo.png'))

    myWidget = QmyWidget()
    myWidget.show()
    sys.exit(app.exec_())

总结

提示:这里对文章进行总结:

以上就是今天要讲的内容,本文将按键的功能如何实现进行了介绍。以下将对软件的发布进行介绍。

;