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 函数,因为它可能会执行不安全的代码。
  • 在实际开发中,应考虑使用更安全和健壮的数学表达式解析器。
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子羽bro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值