使用Qt Designer和PyCharm Python3.7实现简易计算器 并打包成.exe文件

使用Qt Designer和PyCharm Python3.7实现简易计算器

一、使用Qt Designer设计UI界面

        首先在pycharn上面添加pyqt框架,使用其qt designer工具,推荐安装博客:

https://blog.csdn.net/mawei7510/article/details/81450032?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm=1001.2101.3001.4242

拥有了Qt Designer后,首先我们用它设计一个计算器界面。
打开Qt Designe:
在这里插入图片描述

然后进入后我们使用pushButton作为数字和运算符的按钮,而显示屏使用LCD Number组件。
如图:
2
再简单的对其使用水平和垂直布局,然后对每一个pushButon进行命名,我们简单的命名成o1,o2…plus,sub,mul,div,equ,lcd等。下一步是建立每一个按钮的信号-槽关系,就是点击这个按钮执行的函数。这里我们对数字和小数点使用相同的函数digit(),运算符对应的函数为operator(),清除对应的是clear()函数,等于号单独对应equal()函数。设计完成后的界面是:
3
以上就是设计界面的简要过程,下面就是具体代码实现功能。

二、计算器功能实现

界面设计完会生成一个.ui文件,在本文一开始推荐的博客里面有将.ui文件转化成.py的方法,生成的python代码为:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    lcdstring = ''
    operator = ''
    nownumber = 0
    pernumber = 0
    result = 0
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(10)
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lcd = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcd.setGeometry(QtCore.QRect(150, 32, 399, 61))
        self.lcd.setDigitCount(10)
        self.lcd.setObjectName("lcd")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(150, 110, 401, 232))
        self.widget.setObjectName("widget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.o1 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o1.setFont(font)
        self.o1.setObjectName("o1")
        self.horizontalLayout.addWidget(self.o1)
        self.o2 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o2.setFont(font)
        self.o2.setObjectName("o2")
        self.horizontalLayout.addWidget(self.o2)
        self.o3 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o3.setFont(font)
        self.o3.setObjectName("o3")
        self.horizontalLayout.addWidget(self.o3)
        self.div = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.div.setFont(font)
        self.div.setObjectName("div")
        self.horizontalLayout.addWidget(self.div)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.o4 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o4.setFont(font)
        self.o4.setObjectName("o4")
        self.horizontalLayout_2.addWidget(self.o4)
        self.o5 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o5.setFont(font)
        self.o5.setObjectName("o5")
        self.horizontalLayout_2.addWidget(self.o5)
        self.o6 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o6.setFont(font)
        self.o6.setObjectName("o6")
        self.horizontalLayout_2.addWidget(self.o6)
        self.mul = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.mul.setFont(font)
        self.mul.setObjectName("mul")
        self.horizontalLayout_2.addWidget(self.mul)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.o7 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o7.setFont(font)
        self.o7.setObjectName("o7")
        self.horizontalLayout_3.addWidget(self.o7)
        self.o8 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o8.setFont(font)
        self.o8.setObjectName("o8")
        self.horizontalLayout_3.addWidget(self.o8)
        self.o9 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o9.setFont(font)
        self.o9.setObjectName("o9")
        self.horizontalLayout_3.addWidget(self.o9)
        self.sub = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.sub.setFont(font)
        self.sub.setObjectName("sub")
        self.horizontalLayout_3.addWidget(self.sub)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.clear1 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.clear1.setFont(font)
        self.clear1.setObjectName("clear1")
        self.horizontalLayout_4.addWidget(self.clear1)
        self.o0 = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.o0.setFont(font)
        self.o0.setObjectName("o0")
        self.horizontalLayout_4.addWidget(self.o0)
        self.point = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.point.setFont(font)
        self.point.setObjectName("point")
        self.horizontalLayout_4.addWidget(self.point)
        self.plus = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.plus.setFont(font)
        self.plus.setObjectName("plus")
        self.horizontalLayout_4.addWidget(self.plus)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
        self.equ = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(14)
        self.equ.setFont(font)
        self.equ.setObjectName("equ")
        self.verticalLayout_2.addWidget(self.equ)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.clear1.clicked.connect(self.clear)
        self.equ.clicked.connect(self.equal)
        self.sub.clicked.connect(self.opera)
        self.mul.clicked.connect(self.opera)
        self.div.clicked.connect(self.opera)
        self.o1.clicked.connect(self.digit)
        self.o2.clicked.connect(self.digit)
        self.o3.clicked.connect(self.digit)
        self.o4.clicked.connect(self.digit)
        self.o5.clicked.connect(self.digit)
        self.o6.clicked.connect(self.digit)
        self.o7.clicked.connect(self.digit)
        self.o8.clicked.connect(self.digit)
        self.o9.clicked.connect(self.digit)
        self.o0.clicked.connect(self.digit)
        self.point.clicked.connect(self.digit)
        self.plus.clicked.connect(self.opera)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "计算器"))
        self.o1.setText(_translate("MainWindow", "1"))
        self.o2.setText(_translate("MainWindow", "2"))
        self.o3.setText(_translate("MainWindow", "3"))
        self.div.setText(_translate("MainWindow", "/"))
        self.o4.setText(_translate("MainWindow", "4"))
        self.o5.setText(_translate("MainWindow", "5"))
        self.o6.setText(_translate("MainWindow", "6"))
        self.mul.setText(_translate("MainWindow", "*"))
        self.o7.setText(_translate("MainWindow", "7"))
        self.o8.setText(_translate("MainWindow", "8"))
        self.o9.setText(_translate("MainWindow", "9"))
        self.sub.setText(_translate("MainWindow", "-"))
        self.clear1.setText(_translate("MainWindow", "清除"))
        self.o0.setText(_translate("MainWindow", "0"))
        self.point.setText(_translate("MainWindow", "."))
        self.plus.setText(_translate("MainWindow", "+"))
        self.equ.setText(_translate("MainWindow", "="))

注意将connect后面的MainWindow改成self否则会报错,然后就是实现计算器的加减乘除功能,首先在函数里添加五个对象接收lcd内容的lcdstring,两个数字nownumber,pernumber,运算符operator和结果result,具体细节不再赘述,代码:`

def clear(self):
        self.lcdstring = ''
        self.operator = ''
        self.nownumber = 0
        self.pernumber = 0
        self.result = 0
        self.lcd.display(0)#全部置零,显示为零
    def opera(self):
        self.pernumber = self.nownumber
        self.nownumber = 0
        self.lcdstring = ''
        self.operator = self.lcd.sender().objectName()#本身的项目名就是运算符

    def equal(self):
        if self.operator == 'plus':
            self.result = self.pernumber + self.nownumber
            self.lcd.display(self.result)
        if self.operator == 'sub':
            self.result = self.pernumber - self.nownumber
            self.lcd.display(self.result)
        if self.operator == 'mul':
            self.result = self.pernumber * self.nownumber
            self.lcd.display(self.result)
        if self.operator == 'div':
            if self.nownumber == 0:#如果除数为零则输出错误
                self.lcd.display("ERROR")
            else:
                self.result = self.pernumber / self.nownumber
                self.lcd.display(self.result)
        self.nownumber = self.result
        self.lcdstring = ''
    def digit(self):
        if len(self.lcdstring) <= 9:#保证lcd屏只能输入10个数
            self.lcdstring = self.lcdstring + self.lcd.sender().text()
            self.lcd.display(self.lcdstring)
            self.nownumber = float(self.lcdstring)`
 

以上就是功能实现,然后建立主函数文件,调用这个类:

import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from calculator import *

if __name__=='__main__':
    app=QApplication(sys.argv)
    mainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(mainWindow)
    mainWindow.show()
    sys.exit(app.exec_())

以上就是代码实现。

三、打包成.exe文件

现在在Pycharm已经可以运行了:
4
但是这要基于有python环境的计算器,现在我们要将其打包成.exe文件,可以独立在其他平台运行。方法是使用python的pyinstaller库,安装这个库的方法推荐博客:

https://www.jb51.net/article/181438.htm

安装完成后在pycharm的Terminal窗口执行命令
pyinstaller -F -w 主函数名.py
会在dist文件下生成.exe文件,这时候复制出来就可以在没有python环境的情况下运行了。

第一次写博客,哈哈哈,错误之处,还请轻点打。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值