Python使用PyQt开发一个桌面计算器的实战指南

 更新时间:2025年11月05日 09:49:10   作者:Java私教  
在桌面应用开发中,计算器 是一个非常适合入门的练手项目, 它涉及到图形界面设计、事件绑定、信号槽机制、布局管理等核心概念,今天我们将使用 PyQt5一步步实现一个可用的计算器程序,需要的朋友可以参考下

一、前言

在桌面应用开发中,计算器 是一个非常适合入门的练手项目。 它涉及到图形界面设计、事件绑定、信号槽机制、布局管理等核心概念。

今天我们将使用 PyQt5(同样适用于 PyQt6)一步步实现一个可用的计算器程序,从 UI 布局到功能逻辑完整讲解。

最终效果如下:

  • 支持加减乘除和小数运算;
  • 按钮布局整齐;
  • 可通过按钮或键盘输入操作;
  • 界面美观,可打包为独立应用。

二、项目环境

项目依赖说明
Python 3.8+推荐使用 3.9 或以上版本
PyQt5图形界面开发框架
Qt Designer(可选)可视化 UI 设计工具

安装命令:

pip install PyQt5

三、项目结构

我们将项目组织如下:

pyqt_calculator/
│
├── main.py              # 主程序入口
├── calculator.ui        # Qt Designer 设计文件(可选)
└── ui_calculator.py     # UI 转换后的 Python 文件

四、第一步:构建界面

我们先手动创建一个简单的界面,不依赖 Qt Designer。

# main.py
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QLineEdit, QVBoxLayout
from PyQt5.QtCore import Qt
import sys


class Calculator(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt 计算器")
        self.setFixedSize(300, 400)
        self.init_ui()

    def init_ui(self):
        # 显示区域
        self.display = QLineEdit()
        self.display.setAlignment(Qt.AlignRight)
        self.display.setReadOnly(True)
        self.display.setStyleSheet("font-size: 24px; padding: 10px;")

        # 按钮布局
        buttons = {
            '7': (0, 0), '8': (0, 1), '9': (0, 2), '/': (0, 3),
            '4': (1, 0), '5': (1, 1), '6': (1, 2), '*': (1, 3),
            '1': (2, 0), '2': (2, 1), '3': (2, 2), '-': (2, 3),
            '0': (3, 0), '.': (3, 1), 'C': (3, 2), '+': (3, 3),
            '=': (4, 0, 1, 4)
        }

        grid = QGridLayout()
        for text, pos in buttons.items():
            button = QPushButton(text)
            button.setStyleSheet("font-size: 20px; height: 50px;")
            if len(pos) == 2:
                grid.addWidget(button, pos[0], pos[1])
            else:
                grid.addWidget(button, pos[0], pos[1], pos[2], pos[3])
            button.clicked.connect(self.on_button_clicked)

        layout = QVBoxLayout()
        layout.addWidget(self.display)
        layout.addLayout(grid)
        self.setLayout(layout)

    def on_button_clicked(self):
        sender = self.sender().text()
        current = self.display.text()

        if sender == "C":
            self.display.clear()
        elif sender == "=":
            try:
                result = str(eval(current))
                self.display.setText(result)
            except Exception:
                self.display.setText("Error")
        else:
            self.display.setText(current + sender)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Calculator()
    window.show()
    sys.exit(app.exec_())

运行后即可看到一个基础的计算器界面。

五、第二步:添加键盘输入支持

许多用户习惯直接使用键盘输入,我们可以重写 keyPressEvent 方法:

def keyPressEvent(self, event):
    key = event.key()
    if key == Qt.Key_Return or key == Qt.Key_Enter:
        self.on_button_clicked()  # 模拟 "="
    elif key == Qt.Key_Backspace:
        self.display.setText(self.display.text()[:-1])
    else:
        text = event.text()
        if text.isdigit() or text in ['+', '-', '*', '/', '.']:
            self.display.setText(self.display.text() + text)

这样计算器即可同时响应键盘输入。

六、第三步:改进计算逻辑

直接使用 eval() 虽然简单,但存在安全风险。 我们可以使用 Python 内置的 ast 模块安全地解析表达式。

import ast
import operator as op

operators = {
    ast.Add: op.add,
    ast.Sub: op.sub,
    ast.Mult: op.mul,
    ast.Div: op.truediv
}

def safe_eval(expr):
    node = ast.parse(expr, mode='eval').body
    def _eval(node):
        if isinstance(node, ast.Num):
            return node.n
        elif isinstance(node, ast.BinOp):
            return operators[type(node.op)](_eval(node.left), _eval(node.right))
        else:
            raise TypeError(node)
    return _eval(node)

替换掉 eval(current) 部分即可更安全地计算。

七、第四步:美化界面

使用 Qt Style Sheet (QSS) 进行样式美化:

self.setStyleSheet("""
    QWidget {
        background-color: #2E3440;
    }
    QLineEdit {
        background: #3B4252;
        color: #ECEFF4;
        border: none;
        border-radius: 5px;
    }
    QPushButton {
        background-color: #4C566A;
        color: #ECEFF4;
        border-radius: 8px;
    }
    QPushButton:hover {
        background-color: #5E81AC;
    }
    QPushButton:pressed {
        background-color: #81A1C1;
    }
""")

界面将呈现出类似现代深色主题的视觉效果。

八、第五步:项目打包

当应用开发完成后,我们可以使用 pyinstaller 打包为可执行文件:

pip install pyinstaller
pyinstaller -F -w main.py
  • -F:打包为单文件
  • -w:去掉控制台窗口(适合 GUI 应用)

生成的可执行文件在 dist/ 目录中。

九、扩展思路

这个项目的核心结构可以进一步扩展:

  • ✅ 添加括号与优先级运算
  • ✅ 显示历史计算记录
  • ✅ 支持科学计算(sin、cos、sqrt 等)
  • ✅ 国际化(i18n)
  • ✅ 保存用户偏好与主题

通过这些改进,你可以将这个小项目打磨成一个完整的专业级桌面工具。

十、总结

通过本篇实战,我们掌握了以下关键技能:

  • 使用 PyQt5 搭建窗口与控件布局;
  • 理解 信号与槽 的事件机制;
  • 构建计算逻辑与安全求值;
  • 使用 QSS 美化界面;
  • 打包发布桌面应用。

PyQt 的强大不仅在于能做出“好看的界面”,更在于它与 Python 的生态融合: 你可以轻松把它扩展成数据可视化工具、AI 模型控制台、图像处理前端等等。

下一步,不妨试着给这个计算器加上图表或语音输入功能,体验 PyQt 真正的扩展性。

以上就是Python使用PyQt开发一个桌面计算器的实战指南的详细内容,更多关于Python PyQt桌面计算器的资料请关注脚本之家其它相关文章!

相关文章

  • 教你用Python matplotlib库制作简单的动画

    教你用Python matplotlib库制作简单的动画

    今天给大家带来的是关于Python的相关知识,文章围绕着用Python matplotlib制作简单的动画展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • PyCharm MySQL可视化Database配置过程图解

    PyCharm MySQL可视化Database配置过程图解

    这篇文章主要介绍了PyCharm MySQL可视化Database配置过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 编写Python小程序来统计测试脚本的关键字

    编写Python小程序来统计测试脚本的关键字

    这篇文章主要介绍了编写Python小程序来统计测试脚本的关键字的方法,文中的实例不仅可以统计关键字数量,还可以按主关键字来归类,需要的朋友可以参考下
    2016-03-03
  • 使用bandit对目标python代码进行安全函数扫描的案例分析

    使用bandit对目标python代码进行安全函数扫描的案例分析

    这篇文章主要介绍了使用bandit对目标python代码进行安全函数扫描,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Python中的引用与copy介绍

    Python中的引用与copy介绍

    这篇文章主要以整型数据类型及列表为例,详细的介绍了再Python中的引用与copy的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • Python3实现从指定路径查找文件的方法

    Python3实现从指定路径查找文件的方法

    这篇文章主要介绍了Python3实现从指定路径查找文件的方法,涉及Python目录与文件的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Pandas的AB BA类型数据框去重复

    Pandas的AB BA类型数据框去重复

    这篇文章主要为大家介绍了Pandas的AB BA类型数据框去重复实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Pycharm设置去除显示的波浪线方法

    Pycharm设置去除显示的波浪线方法

    今天小编就为大家分享一篇Pycharm设置去除显示的波浪线方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 常见python正则用法的简单实例

    常见python正则用法的简单实例

    下面小编就为大家带来一篇常见python正则用法的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • matplotlib基础绘图命令之bar的使用方法

    matplotlib基础绘图命令之bar的使用方法

    这篇文章主要介绍了matplotlib基础绘图命令之bar的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论