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

Written by

in

文章目录
  • 在桌面应用开发中,计算器 是一个非常适合入门的练手项目。 它涉及到图形界面设计、事件绑定、信号槽机制、布局管理等核心概念。 今天我们将使用 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+tkinter实现简易计算器桌面软件 Python+PyQt5打造一个代码行数统计工具 Python+PyQt5设计实现一个C++源代码行数统计工具 Python+PyQt5开发一个智能键盘模拟输入器(附整体源码) Python+PyQt编写一个批量年龄计算工具
  • 目录
    • 一、前言
    • 二、项目环境
    • 三、项目结构
    • 四、第一步:构建界面
    • 五、第二步:添加键盘输入支持
    • 六、第三步:改进计算逻辑
    • 七、第四步:美化界面
    • 八、第五步:项目打包
    • 九、扩展思路
    • 十、总结

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

    今天我们将使用 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+tkinter实现简易计算器桌面软件
    • Python+PyQt5打造一个代码行数统计工具
    • Python+PyQt5设计实现一个C++源代码行数统计工具
    • Python+PyQt5开发一个智能键盘模拟输入器(附整体源码)
    • Python+PyQt编写一个批量年龄计算工具

    站内搜索