文章目录
- 专栏列表
- 环境准备
- 代码解析
- 主要组件
- 初始化界面
- 布局设置
- 事件处理
- 计算逻辑
- 运行应用
- 完整代码
- 示例截图
- 总结
- 注意
专栏列表
- Python教程(十):面向对象编程(OOP)
- Python教程(十一):单元测试与异常捕获
- Python教程(十二):面向对象高级编程详解
- Python教程(十三):常用内置模块详解
- Python教程(十四):Requests模块详解
- Python教程(十五):IO 编程
- Python教程(十六):进程、线程、线程锁
- Python教程(十七):协程、 asyncio与 aiohttp【异步IO】
- Python教程(十八): 从零到一教会你用 Django【Web 开发】
- Python教程(十九):使用Tkinter制作计算器
- Python教程(二十) : 十分钟入门【PyQt6】
正文开始
,如果觉得文章对您有帮助,请帮我三连+订阅,谢谢
💖💖💖
在这篇文章中,我们将通过一个简单的示例来展示如何使用 PyQt6 库来创建一个图形用户界面(GUI)计算器。PyQt6 是一个用于创建跨平台桌面应用程序的库,它提供了丰富的控件和工具,使得开发图形界面变得简单快捷。
环境准备
在开始之前,请确保你已经安装了 PyQt6。如果尚未安装,可以通过 pip 安装:
pip install PyQt6
代码解析
主要组件
mainWidget
:继承自QWidget
,作为计算器的主窗口。calc
:继承自QMainWindow
,作为应用程序的主窗口。
初始化界面
在 mainWidget
类中,我们首先创建了一个 QLineEdit
控件用于显示输入的表达式和计算结果。然后,我们定义了一个 start
方法来初始化计算器的界面布局。
def start(self):
grid = QGridLayout(self)
grid.setSpacing(10)
self.setGeometry(300, 300, 400, 300)
grid.addWidget(self.edit, 0, 0, 1, 4)
# ...
布局设置
我们使用 QGridLayout
来组织计算器的按钮。通过一个嵌套的列表推导式,我们创建了一个包含按钮位置的列表,然后遍历这个列表,为每个按钮设置位置和事件处理函数。
positions = [(i+1, j) for i in range(5) for j in range(4)]
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
button.setFont(QFont('Arial', 12))
button.clicked.connect(lambda: self.on_button_click(name))
grid.addWidget(button, *position)
事件处理
on_button_click
:当按钮被点击时,这个方法会被调用,它将按钮的文本添加到QLineEdit
控件中。calculate_result
:当点击等号按钮时,这个方法会被调用,它使用eval
函数来计算表达式的结果,并将其显示在QLineEdit
控件中。clear_screen
:清空QLineEdit
控件中的文本。back
:删除QLineEdit
控件中的最后一个字符。
计算逻辑
计算器的核心逻辑在于 calculate
方法,它使用 Python 的 eval
函数来计算字符串形式的数学表达式。这是一个简单直接的方法,但在实际应用中,我们可能需要一个更健壮的解析器来处理复杂的表达式和错误。
def calculate(self, expression):
try:
result = eval(expression)
return str(result)
except Exception as e:
return "Error"
运行应用
最后,我们定义了一个 main
函数来启动应用程序。这个函数创建了一个 QApplication
实例和一个 calc
窗口,并显示它。
def main():
app = QApplication(sys.argv)
ex = calc()
sys.exit(app.exec())
完整代码
import sys
from PyQt6.QtWidgets import (QWidget, QPushButton, QApplication, QMainWindow, QGridLayout, QLineEdit)
from PyQt6.QtGui import QFont
class mainWidget(QWidget):
def __init__(self):
super().__init__()
self.edit = QLineEdit("123")
self.edit.setFont(QFont('Arial', 20))
self.start()
def add(self,*args):
sender = self.sender()
print('print',args)
print('print',sender.text())
def start(self):
grid = QGridLayout(self)
grid.setSpacing(10)
self.setGeometry(300,300,400,300)
grid.addWidget(self.edit, 0, 0,1,4)
names = ['Cls', 'Bck', '', '',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i+1, j) for i in range(5) for j in range(4)]
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
button.setFont(QFont('Arial', 12))
button.clicked.connect(lambda: self.on_button_click(name))
grid.addWidget(button, *position)
back = QPushButton("Bck")
back.setFont(QFont('Arial', 12))
back.clicked.connect(lambda: self.back())
grid.addWidget(back,1,1)
equal = QPushButton("=")
equal.setFont(QFont('Arial', 12))
equal.clicked.connect(lambda: self.calculate_result())
grid.addWidget(equal, 5, 2)
Cls = QPushButton("Cls")
Cls.setFont(QFont('Arial', 12))
Cls.clicked.connect(lambda: self.clear_screen())
grid.addWidget(Cls, 1, 0)
def calculate(self,expression):
try:
result = eval(expression)
return str(result)
except Exception as e:
return "Error"
# 按钮点击事件
def on_button_click(self,*args):
current_expression = self.edit.text()
text = self.sender().text()
print(current_expression , text)
self.edit.setText( current_expression +text)
# # 清除屏幕
def clear_screen(self):
self.edit.setText('')
# 计算结果
def calculate_result(self):
current_expression = self.edit.text()
result = self.calculate(current_expression)
print(result)
self.edit.setText(result)
# 计算结果
def back(self):
current_expression = self.edit.text()
result =current_expression[0:len(current_expression)-1]
self.edit.setText(result)
class calc(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('计算器准备就绪')
widget = mainWidget()
self.setCentralWidget(widget)
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('PyQt6 制作计算器')
self.show()
def main():
app = QApplication(sys.argv)
ex = calc()
sys.exit(app.exec())
if __name__ == '__main__':
main()
示例截图
总结
通过这篇文章,我们展示了如何使用 PyQt6 来创建一个简单的计算器应用。这个示例涵盖了 PyQt6 应用程序的基本结构,包括窗口、布局、控件和事件处理。希望这个示例能够帮助你理解 PyQt6 的基本概念,并激发你进一步探索和学习 PyQt6 的兴趣。
注意
- 实际应用中应避免使用
eval
函数,因为它可能会执行不安全的代码。 - 在实际开发中,应考虑使用更安全和健壮的数学表达式解析器。