Python项目——计算器(PySide6+Pyinstaller)

1、介绍

  • 使用python编写一个计算器,可以实现基本的运算。
  • Python项目——计算器(PySide6+Pyinstaller)_第1张图片
  • 【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。

2、实现

  • 使用pyCharm创建一个新的项目。 
    • Python项目——计算器(PySide6+Pyinstaller)_第2张图片
2.1、设计UI
  • 使用Qt designer设计一个UI界面,保存ui文件,再转换为py文件并保存到项目目录中,供后续使用。
    • Python项目——计算器(PySide6+Pyinstaller)_第3张图片
    • 具体方法:Pyside6入门教学——编写一个UI界面并显示-CSDN博客

  • 生成的py文件如下: 
    • # -*- coding: utf-8 -*-
      
      ################################################################################
      ## Form generated from reading UI file 'untitled.ui'
      ##
      ## Created by: Qt User Interface Compiler version 6.6.1
      ##
      ## WARNING! All changes made in this file will be lost when recompiling UI file!
      ################################################################################
      
      from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
          QMetaObject, QObject, QPoint, QRect,
          QSize, QTime, QUrl, Qt)
      from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
          QFont, QFontDatabase, QGradient, QIcon,
          QImage, QKeySequence, QLinearGradient, QPainter,
          QPalette, QPixmap, QRadialGradient, QTransform)
      from PySide6.QtWidgets import (QApplication, QLineEdit, QMainWindow, QMenuBar,
          QPushButton, QSizePolicy, QStatusBar, QWidget)
      
      class Ui_MainWindow(object):
          def setupUi(self, MainWindow):
              if not MainWindow.objectName():
                  MainWindow.setObjectName(u"MainWindow")
              MainWindow.resize(300, 350)
              MainWindow.setMinimumSize(QSize(300, 350))
              MainWindow.setMaximumSize(QSize(300, 350))
              self.centralwidget = QWidget(MainWindow)
              self.centralwidget.setObjectName(u"centralwidget")
              self.lineEdit = QLineEdit(self.centralwidget)
              self.lineEdit.setObjectName(u"lineEdit")
              self.lineEdit.setGeometry(QRect(30, 20, 241, 41))
              self.lineEdit.setMinimumSize(QSize(0, 0))
              self.lineEdit.setReadOnly(True)
              self.seven = QPushButton(self.centralwidget)
              self.seven.setObjectName(u"seven")
              self.seven.setGeometry(QRect(30, 130, 51, 41))
              self.eight = QPushButton(self.centralwidget)
              self.eight.setObjectName(u"eight")
              self.eight.setGeometry(QRect(90, 130, 51, 41))
              self.nine = QPushButton(self.centralwidget)
              self.nine.setObjectName(u"nine")
              self.nine.setGeometry(QRect(150, 130, 51, 41))
              self.exc = QPushButton(self.centralwidget)
              self.exc.setObjectName(u"exc")
              self.exc.setGeometry(QRect(210, 130, 61, 41))
              self.six = QPushButton(self.centralwidget)
              self.six.setObjectName(u"six")
              self.six.setGeometry(QRect(150, 180, 51, 41))
              self.four = QPushButton(self.centralwidget)
              self.four.setObjectName(u"four")
              self.four.setGeometry(QRect(30, 180, 51, 41))
              self.mul = QPushButton(self.centralwidget)
              self.mul.setObjectName(u"mul")
              self.mul.setGeometry(QRect(210, 180, 61, 41))
              self.five = QPushButton(self.centralwidget)
              self.five.setObjectName(u"five")
              self.five.setGeometry(QRect(90, 180, 51, 41))
              self.three = QPushButton(self.centralwidget)
              self.three.setObjectName(u"three")
              self.three.setGeometry(QRect(150, 230, 51, 41))
              self.one = QPushButton(self.centralwidget)
              self.one.setObjectName(u"one")
              self.one.setGeometry(QRect(30, 230, 51, 41))
              self.sub = QPushButton(self.centralwidget)
              self.sub.setObjectName(u"sub")
              self.sub.setGeometry(QRect(210, 230, 61, 41))
              self.two = QPushButton(self.centralwidget)
              self.two.setObjectName(u"two")
              self.two.setGeometry(QRect(90, 230, 51, 41))
              self.equal = QPushButton(self.centralwidget)
              self.equal.setObjectName(u"equal")
              self.equal.setGeometry(QRect(150, 280, 51, 41))
              self.zero = QPushButton(self.centralwidget)
              self.zero.setObjectName(u"zero")
              self.zero.setGeometry(QRect(30, 280, 51, 41))
              self.add = QPushButton(self.centralwidget)
              self.add.setObjectName(u"add")
              self.add.setGeometry(QRect(210, 280, 61, 41))
              self.point = QPushButton(self.centralwidget)
              self.point.setObjectName(u"point")
              self.point.setGeometry(QRect(90, 280, 51, 41))
              self.clear = QPushButton(self.centralwidget)
              self.clear.setObjectName(u"clear")
              self.clear.setGeometry(QRect(30, 80, 111, 41))
              self.back = QPushButton(self.centralwidget)
              self.back.setObjectName(u"back")
              self.back.setGeometry(QRect(210, 80, 61, 41))
              MainWindow.setCentralWidget(self.centralwidget)
              self.menubar = QMenuBar(MainWindow)
              self.menubar.setObjectName(u"menubar")
              self.menubar.setGeometry(QRect(0, 0, 300, 21))
              MainWindow.setMenuBar(self.menubar)
              self.statusbar = QStatusBar(MainWindow)
              self.statusbar.setObjectName(u"statusbar")
              MainWindow.setStatusBar(self.statusbar)
      
              self.retranslateUi(MainWindow)
      
              QMetaObject.connectSlotsByName(MainWindow)
          # setupUi
      
          def retranslateUi(self, MainWindow):
              MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u8ba1\u7b97\u5668", None))
              self.seven.setText(QCoreApplication.translate("MainWindow", u"7", None))
              self.eight.setText(QCoreApplication.translate("MainWindow", u"8", None))
              self.nine.setText(QCoreApplication.translate("MainWindow", u"9", None))
              self.exc.setText(QCoreApplication.translate("MainWindow", u"\u00f7", None))
              self.six.setText(QCoreApplication.translate("MainWindow", u"6", None))
              self.four.setText(QCoreApplication.translate("MainWindow", u"4", None))
              self.mul.setText(QCoreApplication.translate("MainWindow", u"\u00d7", None))
              self.five.setText(QCoreApplication.translate("MainWindow", u"5", None))
              self.three.setText(QCoreApplication.translate("MainWindow", u"3", None))
              self.one.setText(QCoreApplication.translate("MainWindow", u"1", None))
              self.sub.setText(QCoreApplication.translate("MainWindow", u"-", None))
              self.two.setText(QCoreApplication.translate("MainWindow", u"2", None))
              self.equal.setText(QCoreApplication.translate("MainWindow", u"=", None))
              self.zero.setText(QCoreApplication.translate("MainWindow", u"0", None))
              self.add.setText(QCoreApplication.translate("MainWindow", u"+", None))
              self.point.setText(QCoreApplication.translate("MainWindow", u".", None))
              self.clear.setText(QCoreApplication.translate("MainWindow", u"C", None))
              self.back.setText(QCoreApplication.translate("MainWindow", u"DEL", None))
          # retranslateUi
2.2、编写代码
  • 在项目目录下创建一个main.py文件。 
    • from PySide6.QtWidgets import QApplication, QMainWindow
      from ui import Ui_MainWindow
      import sys
      
      
      class MainWindow(QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.ui = Ui_MainWindow()  # UI类的实例化
              self.ui.setupUi(self)
              self.result = ''  # 计算结果
              self.numberResult = 0
              self.bind()  # 绑定函数,不让初始化中的代码过多
      
          # 绑定
          def bind(self):
              # lambda的作用是连接一个临时函数
              self.ui.zero.clicked.connect(lambda: self.addNumber('0'))  # 0
              self.ui.one.clicked.connect(lambda: self.addNumber('1'))  # 1
              self.ui.two.clicked.connect(lambda: self.addNumber('2'))  # 2
              self.ui.three.clicked.connect(lambda: self.addNumber('3'))  # 3
              self.ui.four.clicked.connect(lambda: self.addNumber('4'))  # 4
              self.ui.five.clicked.connect(lambda: self.addNumber('5'))  # 5
              self.ui.six.clicked.connect(lambda: self.addNumber('6'))  # 6
              self.ui.seven.clicked.connect(lambda: self.addNumber('7'))  # 7
              self.ui.eight.clicked.connect(lambda: self.addNumber('8'))  # 8
              self.ui.nine.clicked.connect(lambda: self.addNumber('9'))  # 9
              self.ui.add.clicked.connect(lambda: self.addNumber('+'))  # 加
              self.ui.sub.clicked.connect(lambda: self.addNumber('-'))  # 减
              self.ui.mul.clicked.connect(lambda: self.addNumber('*'))  # 乘
              self.ui.exc.clicked.connect(lambda: self.addNumber('/'))  # 除
              self.ui.point.clicked.connect(lambda: self.addNumber('.'))  # 小数点
              self.ui.equal.clicked.connect(lambda: self.equal())  # 等于
              self.ui.back.clicked.connect(lambda: self.back())  # 回退
              self.ui.clear.clicked.connect(lambda: self.clear())  # 清除
      
          # 输入表达式
          def addNumber(self, number):
              self.ui.lineEdit.clear()
              self.result += number
              self.ui.lineEdit.setText(self.result)
      
          # 计算
          def equal(self):
              self.numberResult = eval(self.result)  # 计算结果
              self.ui.lineEdit.setText(str(self.numberResult))
      
          # 回退
          def back(self):
              self.result = self.result[:-1]  # 移除最后一个元素
              self.ui.lineEdit.setText(self.result)
      
          # 清除
          def clear(self):
              self.ui.lineEdit.clear()
              self.result = ''
              self.ui.lineEdit.setText(self.result)
      
      
      if __name__ == '__main__':
          app = QApplication([])  # 启动一个应用
          window = MainWindow()  # 实例化主窗口
          window.show()  # 展示主窗口
          sys.exit(app.exec())  # 关闭窗口,程序停止运行

3、打包

  • 将该项目打包成一个exe可执行文件。打开终端,进入主函数所在路径。
    • pyinstaller -F -w main.py
      # -F:打包成单个文件
      # -w:打开时不显示终端
    • Python项目——计算器(PySide6+Pyinstaller)_第4张图片
  • 生成一个dist文件夹,其中包含了exe文件。
    • Python项目——计算器(PySide6+Pyinstaller)_第5张图片

你可能感兴趣的:(Python,python,开发语言)