Python使用PyQt開發(fā)一個(gè)桌面計(jì)算器的實(shí)戰(zhàn)指南
一、前言
在桌面應(yīng)用開發(fā)中,計(jì)算器 是一個(gè)非常適合入門的練手項(xiàng)目。 它涉及到圖形界面設(shè)計(jì)、事件綁定、信號(hào)槽機(jī)制、布局管理等核心概念。
今天我們將使用 PyQt5(同樣適用于 PyQt6)一步步實(shí)現(xiàn)一個(gè)可用的計(jì)算器程序,從 UI 布局到功能邏輯完整講解。
最終效果如下:
- 支持加減乘除和小數(shù)運(yùn)算;
- 按鈕布局整齊;
- 可通過按鈕或鍵盤輸入操作;
- 界面美觀,可打包為獨(dú)立應(yīng)用。
二、項(xiàng)目環(huán)境
| 項(xiàng)目依賴 | 說明 |
|---|---|
| Python 3.8+ | 推薦使用 3.9 或以上版本 |
| PyQt5 | 圖形界面開發(fā)框架 |
| Qt Designer(可選) | 可視化 UI 設(shè)計(jì)工具 |
安裝命令:
pip install PyQt5
三、項(xiàng)目結(jié)構(gòu)
我們將項(xiàng)目組織如下:
pyqt_calculator/ │ ├── main.py # 主程序入口 ├── calculator.ui # Qt Designer 設(shè)計(jì)文件(可選) └── ui_calculator.py # UI 轉(zhuǎn)換后的 Python 文件
四、第一步:構(gòu)建界面
我們先手動(dòng)創(chuàng)建一個(gè)簡單的界面,不依賴 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 計(jì)算器")
self.setFixedSize(300, 400)
self.init_ui()
def init_ui(self):
# 顯示區(qū)域
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_())
運(yùn)行后即可看到一個(gè)基礎(chǔ)的計(jì)算器界面。
五、第二步:添加鍵盤輸入支持
許多用戶習(xí)慣直接使用鍵盤輸入,我們可以重寫 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)
這樣計(jì)算器即可同時(shí)響應(yīng)鍵盤輸入。
六、第三步:改進(jìn)計(jì)算邏輯
直接使用 eval() 雖然簡單,但存在安全風(fēng)險(xiǎn)。 我們可以使用 Python 內(nèi)置的 ast 模塊安全地解析表達(dá)式。
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) 部分即可更安全地計(jì)算。
七、第四步:美化界面
使用 Qt Style Sheet (QSS) 進(jìn)行樣式美化:
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;
}
""")
界面將呈現(xiàn)出類似現(xiàn)代深色主題的視覺效果。
八、第五步:項(xiàng)目打包
當(dāng)應(yīng)用開發(fā)完成后,我們可以使用 pyinstaller 打包為可執(zhí)行文件:
pip install pyinstaller pyinstaller -F -w main.py
-F:打包為單文件-w:去掉控制臺(tái)窗口(適合 GUI 應(yīng)用)
生成的可執(zhí)行文件在 dist/ 目錄中。
九、擴(kuò)展思路
這個(gè)項(xiàng)目的核心結(jié)構(gòu)可以進(jìn)一步擴(kuò)展:
- ? 添加括號(hào)與優(yōu)先級(jí)運(yùn)算
- ? 顯示歷史計(jì)算記錄
- ? 支持科學(xué)計(jì)算(sin、cos、sqrt 等)
- ? 國際化(i18n)
- ? 保存用戶偏好與主題
通過這些改進(jìn),你可以將這個(gè)小項(xiàng)目打磨成一個(gè)完整的專業(yè)級(jí)桌面工具。
十、總結(jié)
通過本篇實(shí)戰(zhàn),我們掌握了以下關(guān)鍵技能:
- 使用 PyQt5 搭建窗口與控件布局;
- 理解 信號(hào)與槽 的事件機(jī)制;
- 構(gòu)建計(jì)算邏輯與安全求值;
- 使用 QSS 美化界面;
- 打包發(fā)布桌面應(yīng)用。
PyQt 的強(qiáng)大不僅在于能做出“好看的界面”,更在于它與 Python 的生態(tài)融合: 你可以輕松把它擴(kuò)展成數(shù)據(jù)可視化工具、AI 模型控制臺(tái)、圖像處理前端等等。
下一步,不妨試著給這個(gè)計(jì)算器加上圖表或語音輸入功能,體驗(yàn) PyQt 真正的擴(kuò)展性。
以上就是Python使用PyQt開發(fā)一個(gè)桌面計(jì)算器的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Python PyQt桌面計(jì)算器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python新手學(xué)習(xí)函數(shù)默認(rèn)參數(shù)設(shè)置
在本篇文章里小編給大家分享的是關(guān)于Python新手學(xué)習(xí)函數(shù)默認(rèn)參數(shù)設(shè)置的相關(guān)知識(shí)點(diǎn),需要的朋友們可以參考下。2020-06-06
使用Python自動(dòng)處理Excel數(shù)據(jù)缺失值的完整指南
在數(shù)據(jù)分析中,數(shù)據(jù)清洗是至關(guān)重要的第一步,尤其在處理 Excel 文件時(shí),缺失值常常會(huì)阻礙分析流程,本文將通過一個(gè)自動(dòng)化腳本,展示如何使用 Python 的 pandas 和 scikit-learn 庫,快速填充或刪除 Excel 文件中的缺失值,并最終生成干凈的數(shù)據(jù)集,需要的朋友可以參考下2025-04-04
Django實(shí)現(xiàn)發(fā)送郵件找回密碼功能
在各大網(wǎng)站上,一定都遇到過找回密碼的問題,通常采用的方式是通過發(fā)送帶有驗(yàn)證碼的郵件進(jìn)行身份驗(yàn)證,本文將介紹通過Django實(shí)現(xiàn)郵件找回密碼功能,需要的朋友可以參考下2019-08-08
WINDOWS 同時(shí)安裝 python2 python3 后 pip 錯(cuò)誤的解決方法
這篇文章主要給大家分享的是在WINDOWS下同時(shí)安裝 python2 python3 后 pip 錯(cuò)誤的解決方法,非常的實(shí)用,有需要的小伙伴可以參考下2017-03-03
Python基于ssh遠(yuǎn)程連接Mysql數(shù)據(jù)庫操作
這篇文章主要為大家介紹了Python基于ssh遠(yuǎn)程連接Mysql數(shù)據(jù)庫操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
python GUI庫圖形界面開發(fā)之PyQt5美化窗體與控件(異形窗體)實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5美化窗體與控件(異形窗體)實(shí)例,需要的朋友可以參考下2020-02-02

