一、前言
在桌面应用开发中,计算器 是一个非常适合入门的练手项目。 它涉及到图形界面设计、事件绑定、信号槽机制、布局管理等核心概念。
今天我们将使用 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桌面计算器的资料请关注代码网其它相关文章!
发表评论