ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/13 6:44:49 拓冰建站 浏览量
Python项目——计算器(PySide6+Pyinstaller)

1、介绍

  • 使用python编写一个计算器,可以实现基本的运算。
  • 【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。

2、实现

  • 使用pyCharm创建一个新的项目。 
2.1、设计UI
  • 使用Qt designer设计一个UI界面,保存ui文件,再转换为py文件并保存到项目目录中,供后续使用。
    • 具体方法: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)# setupUidef 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 sysclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init__()self.ui = Ui_MainWindow()  # UI类的实例化self.ui.setupUi(self)self.result = ''  # 计算结果self.numberResult = 0self.bind()  # 绑定函数,不让初始化中的代码过多# 绑定def bind(self):# lambda的作用是连接一个临时函数self.ui.zero.clicked.connect(lambda: self.addNumber('0'))  # 0self.ui.one.clicked.connect(lambda: self.addNumber('1'))  # 1self.ui.two.clicked.connect(lambda: self.addNumber('2'))  # 2self.ui.three.clicked.connect(lambda: self.addNumber('3'))  # 3self.ui.four.clicked.connect(lambda: self.addNumber('4'))  # 4self.ui.five.clicked.connect(lambda: self.addNumber('5'))  # 5self.ui.six.clicked.connect(lambda: self.addNumber('6'))  # 6self.ui.seven.clicked.connect(lambda: self.addNumber('7'))  # 7self.ui.eight.clicked.connect(lambda: self.addNumber('8'))  # 8self.ui.nine.clicked.connect(lambda: self.addNumber('9'))  # 9self.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 += numberself.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:打开时不显示终端
  • 生成一个dist文件夹,其中包含了exe文件。