📜  PyQt5 – 百分位数计算器(1)

📅  最后修改于: 2023-12-03 14:45:51.080000             🧑  作者: Mango

PyQt5 – 百分位数计算器

本文将介绍如何使用 PyQt5 创建一个简单的百分位数计算器。百分位数计算器可以通过输入数据集和百分位数来计算相应的值。

程序截图

以下是我们要创建的百分位数计算器的截图:

百分位数计算器

创建应用程序

下一步是创建应用程序。我们将需要使用 PyQt5 模块中的许多类和函数来实现它。

我们首先要导入 PyQt5 中的必要类和模块:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton
from PyQt5.QtCore import Qt
import numpy as np

这里我们导入了 QApplicationQMainWindowQLabelQLineEditQPushButton 等类,以及 Qt 常量和 numpy 模块。

接下来,我们要创建一个 MainWindow 类,用于表示我们的主窗口:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("百分位数计算器")
        self.setGeometry(100, 100, 400, 300)

        self.centralWidget = QLabel(self)
        self.centralWidget.setAlignment(Qt.AlignCenter)
        self.centralWidget.setText("输入数据集和百分位数")

        self.dataLabel = QLabel(self)
        self.dataLabel.setText("数据集:")
        self.dataLabel.move(50, 50)

        self.percentileLabel = QLabel(self)
        self.percentileLabel.setText("百分位数:")
        self.percentileLabel.move(50, 100)

        self.dataLineEdit = QLineEdit(self)
        self.dataLineEdit.move(150, 50)

        self.percentileLineEdit = QLineEdit(self)
        self.percentileLineEdit.move(150, 100)

        self.calculateButton = QPushButton(self)
        self.calculateButton.setText("计算")
        self.calculateButton.move(150, 150)

在这个类中,我们首先设置了窗口的标题和大小,然后创建了一个 centralWidget,用于放置我们的控件。接下来,我们创建了两个 QLabel,分别用于显示 “数据集” 和 “百分位数”,并创建了两个 QLineEdit,用于输入数据集和百分位数。

最后,我们创建了一个 QPushButton,用于执行计算操作。

创建计算函数

为了计算百分位数,我们需要编写一个函数。这个函数将会接受两个参数:数据集和百分位数。

下面是该函数的代码:

def calculatePercentile(self, data, percentile):
    sortedData = np.sort(data) # 将数据集按升序排序
    index = (percentile / 100) * (len(sortedData) - 1) # 计算百分位数在排序过后的数据集中的位置

    if index.is_integer():
        return sortedData[int(index)] # 如果 index 是整数,则直接返回对应位置的值

    # 如果 index 不是整数,则需要进行线性插值
    lowerIndex = int(index)
    upperIndex = lowerIndex + 1
    lowerValue = sortedData[lowerIndex]
    upperValue = sortedData[upperIndex]
    return lowerValue + ((index - lowerIndex) * (upperValue - lowerValue))

此函数首先通过 numpy 中的 sort 函数将数据集按升序排序。然后,它计算了百分位数在排序过后的数据集中的索引位置。如果该位置是整数,则直接返回该位置的值。否则,需要进行线性插值。

把计算函数和按钮关联起来

要使计算函数与按钮关联起来,我们需要使用 clicked 信号和 connect 函数:

self.calculateButton.clicked.connect(self.onCalculateButtonClick)

在这里,我们将 clicked 信号连接到 onCalculateButtonClick 函数上,该函数将调用我们编写的 calculatePercentile 函数。

def onCalculateButtonClick(self):
    try:
        data = [float(x) for x in self.dataLineEdit.text().split(",")]
        percentile = float(self.percentileLineEdit.text())

        result = self.calculatePercentile(data, percentile)

        self.centralWidget.setText("结果:{}".format(result))

    except Exception as ex:
        self.centralWidget.setText("发生错误:{}".format(str(ex)))

在这个函数中,我们首先从文本框中获取数据集和百分位数。如果输入值无效,则会发生异常。否则,我们将调用 calculatePercentile 函数,然后将结果显示在主窗口的 centralWidget 中。

运行程序

最后,我们还需要创建一个 QApplication 实例,并使用 MainWindow 类创建一个窗口对象,然后使用 show 函数将其显示出来。

app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

现在,我们的百分位数计算器已经可以正常运行了。

完整代码片段

下面是完整的代码:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton
from PyQt5.QtCore import Qt
import numpy as np

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("百分位数计算器")
        self.setGeometry(100, 100, 400, 300)

        self.centralWidget = QLabel(self)
        self.centralWidget.setAlignment(Qt.AlignCenter)
        self.centralWidget.setText("输入数据集和百分位数")

        self.dataLabel = QLabel(self)
        self.dataLabel.setText("数据集:")
        self.dataLabel.move(50, 50)

        self.percentileLabel = QLabel(self)
        self.percentileLabel.setText("百分位数:")
        self.percentileLabel.move(50, 100)

        self.dataLineEdit = QLineEdit(self)
        self.dataLineEdit.move(150, 50)

        self.percentileLineEdit = QLineEdit(self)
        self.percentileLineEdit.move(150, 100)

        self.calculateButton = QPushButton(self)
        self.calculateButton.setText("计算")
        self.calculateButton.move(150, 150)

        self.calculateButton.clicked.connect(self.onCalculateButtonClick)

    def calculatePercentile(self, data, percentile):
        sortedData = np.sort(data)
        index = (percentile / 100) * (len(sortedData) - 1)

        if index.is_integer():
            return sortedData[int(index)]

        lowerIndex = int(index)
        upperIndex = lowerIndex + 1
        lowerValue = sortedData[lowerIndex]
        upperValue = sortedData[upperIndex]
        return lowerValue + ((index - lowerIndex) * (upperValue - lowerValue))

    def onCalculateButtonClick(self):
        try:
            data = [float(x) for x in self.dataLineEdit.text().split(",")]
            percentile = float(self.percentileLineEdit.text())

            result = self.calculatePercentile(data, percentile)

            self.centralWidget.setText("结果:{}".format(result))

        except Exception as ex:
            self.centralWidget.setText("发生错误:{}".format(str(ex)))

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()
总结

在本教程中,我们学习了如何使用 PyQt5 创建一个简单的百分位数计算器。我们了解了如何创建QWidget、QLabel、QLineEdit和QPushButton等控件,并将其相应的信号槽连接。我们还编写了一个用于计算百分位数的函数,并在按钮被单击时调用它。