跳至主要内容

PySide6 教程:使用 Python 构建图形界面应用

学习 PySide6 的基础知识,构建您的第一个桌面应用,并将流行数据科学库中的数据可视化集成其中。
· 14分钟 阅读

使用 AI 探索

直面现实:作为数据从业者,您创建的 Jupyter Notebooks 或 Python 脚本,对非技术干系人或终端用户来说并没有吸引力。他们希望能够与解决方案交互,并亲自看到结果。

这就是我们需要将工作转化为洞察报告、仪表板或数据科学应用的原因。报告、仪表板和 Web 应用很常见,但一个较少被探索的替代方案是桌面应用。

想象一下,您可以设计一个应用,用户能够点击按钮、填写表单、通过菜单导航——所有这一切都在桌面上一目了然、令人愉悦的界面中完成。这是不是很酷?

在本教程中,我们将介绍 PySide6,帮助您完成初始安装,并构建您的第一个桌面应用。我们还将探索常用的小部件(widgets)、集成来自流行数据科学库的可视化,并分享实用资源。

什么是 PySide6?

PySide6 是一个工具包,可让您用 Python 编程语言创建具有美观直观图形界面的软件应用。

它就像软件的积木,即使是编程新手也能将构成应用的可视与交互元素拼装起来。借助 PySide6,您可以将想法变为可在 Windows、Mac、Linux,甚至移动平台上运行的真正应用。

安装 PySide6

在设置方面,我们假设您已经安装了 Python,并配好了常用的 IDE。安装过程相当直接。

打开终端运行以下命令即可。

pip3 install pyside6

构建您的第一个 PySide6 应用

既然您已成功安装该库,下一步就是构建第一个 PySide6 应用。这也有助于我们测试环境是否正常,同时让您初步感受桌面应用。

创建一个名为“main.py”的 Python 文件,并将以下代码复制粘贴进去。

import sys
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel('Hello, PySide6!')
label.show()
sys.exit(app.exec_())

代码我们稍后再理解,先在终端中如下运行该 Python 文件:

python3 run main.py

恭喜,您已经构建了第一个桌面应用!您应该会看到如下界面:

“Hello, PySide6” 桌面应用(作者拍摄)

“Hello, PySide6” 桌面应用(作者拍摄)

现在来拆解一下刚才这段简单的 PySide6 脚本。首先导入相关模块:

import sys
from PySide6.QtWidgets import QApplication, QLabel
  • sys 是 Python 标准库模块,提供对 Python 解释器使用或维护的一些变量的访问。在 PySide6 应用中,它常用于命令行参数。查阅我们的命令行参数解析教程了解更多。
  • 从 PySide6.QtWidgets 导入 QApplication 和 QLabel。QApplication 是 PySide6 中的核心应用管理类,任何 GUI 应用都需要它。QLabel 是一个用于显示文本的小部件,我们用它来展示一条简单消息。

接下来,我们创建一个 QApplication 实例。

app = QApplication(sys.argv)

在每个 PySide6 应用中这都是必需的。sys.argv 用于向应用传递命令行参数。即使您不使用命令行参数,也仍需传入 sys.argv,因为它会用一些默认值初始化 QApplication。

label = QLabel('Hello, PySide6!')

接着,我们创建一个带有文本 "Hello, PySide6!" 的 QLabel 小部件。这就是应用窗口中显示的文本。

label.show()

这行代码让 label 可见。默认情况下,PySide6 中的小部件在您显式显示之前是不可见的。

sys.exit(app.exec_())

最后,这行代码启动应用的事件循环。QApplication 的 exec_() 方法会进入应用的主循环,在那里处理所有事件(如鼠标点击、键盘按键)。调用 sys.exit() 可确保应用关闭时干净退出。事件循环会一直运行,直到 QApplication 实例收到退出信号,例如关闭窗口。

正如之前的输出所示,我们的脚本创建了一个基本的图形界面应用,单窗口显示文本“Hello, PySide6!”。

在图形界面应用中集成 PySide6 小部件

在 PySide6 和 GUI 的语境中,小部件是用于在软件应用中创建用户界面的基本构件。可以把小部件看作您在任何软件应用中看到并与之交互的各种元素——比如按钮、文本框、标签、滑块和下拉菜单。

在第一个 PySide6 应用中,我们看到了用于显示文本的标签小部件。使用 PySide6 构建 GUI 时,实质上就是在窗口中以符合应用逻辑的方式排列这些小部件。每个小部件都承担特定用途,并以不同方式与用户交互。

在官方文档中可以找到完整的小部件清单及其用法,但最常用的有:

  • QLabel:用于显示文本或图像的小部件。它常用于展示说明、消息,甚至在 GUI 中显示图片。
  • QPushButton:用户可点击以触发某些操作的按钮。它是 GUI 开发中最基础的小部件之一,用于提交表单、启动进程等。
  • QLineEdit:允许用户输入和编辑单行文本的小部件。常见于需要文本输入的表单和设置,例如输入姓名或数字。
  • QComboBox:下拉列表与文本框的组合,允许用户从预设选项中选择,或自行输入。
  • QCheckBox:提供可勾选或取消勾选的方框。通常用于启用/禁用功能,或表示同意条款与条件。
  • QRadioButton:用于从一组选项中选择其一。单选按钮在组内仅允许一个选择,适合性别、年龄范围或其他互斥选项。
  • QTextEdit:用于多行文本编辑的小部件,功能比 QLineEdit 更丰富,如文本格式化、复制粘贴和滚动。
  • QSlider:提供滑块控件,适合在范围内输入数值,如调节音量或设置价格筛选。
  • QSpinBox:允许用户在给定范围内选择数字的小部件。用户可通过上下小箭头增减数值。
  • QProgressBar:显示任务进度。以可视化方式呈现完成百分比,适合跟踪文件上传/下载等过程。
  • QTableWidget:适合以表格形式展示数据。可将数据组织为行列,便于展示与操作结构化数据。

我们来创建一个应用,使用并展示这些常见小部件:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QLineEdit, QComboBox, QCheckBox, QRadioButton, QTextEdit, QSlider, QSpinBox, QProgressBar, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout, QWidget

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

       # Main Widget and Layout
       main_widget = QWidget()
       self.setCentralWidget(main_widget)
       main_layout = QVBoxLayout(main_widget)

       # Function to add widget with label
       def add_widget_with_label(layout, widget, label_text):
           hbox = QHBoxLayout()
           label = QLabel(label_text)
           hbox.addWidget(label)
           hbox.addWidget(widget)
           layout.addLayout(hbox)

       # QLabel
       self.label = QLabel('Hello PySide6!')
       add_widget_with_label(main_layout, self.label, 'QLabel:')

       # QPushButton
       self.button = QPushButton('Click Me')
       self.button.clicked.connect(self.on_button_clicked)
       add_widget_with_label(main_layout, self.button, 'QPushButton:')

       # QLineEdit
       self.line_edit = QLineEdit()
       add_widget_with_label(main_layout, self.line_edit, 'QLineEdit:')

       # QComboBox
       self.combo_box = QComboBox()
       self.combo_box.addItems(['Option 1', 'Option 2', 'Option 3'])
       add_widget_with_label(main_layout, self.combo_box, 'QComboBox:')

       # QCheckBox
       self.check_box = QCheckBox('Check Me')
       add_widget_with_label(main_layout, self.check_box, 'QCheckBox:')

       # QRadioButton
       self.radio_button = QRadioButton('Radio Button')
       add_widget_with_label(main_layout, self.radio_button, 'QRadioButton:')

       # QTextEdit
       self.text_edit = QTextEdit()
       add_widget_with_label(main_layout, self.text_edit, 'QTextEdit:')

       # QSlider
       self.slider = QSlider()
       add_widget_with_label(main_layout, self.slider, 'QSlider:')

       # QSpinBox
       self.spin_box = QSpinBox()
       add_widget_with_label(main_layout, self.spin_box, 'QSpinBox:')

       # QProgressBar
       self.progress_bar = QProgressBar()
       add_widget_with_label(main_layout, self.progress_bar, 'QProgressBar:')

       # QTableWidget
       self.table_widget = QTableWidget(5, 3) 
       for i in range(5):
           for j in range(3):
               item = QTableWidgetItem(f"Cell {i+1},{j+1}")
               self.table_widget.setItem(i, j, item)
       add_widget_with_label(main_layout, self.table_widget, 'QTableWidget:')

   def on_button_clicked(self):
       self.label.setText('Button Clicked!')

# Run the application
app = QApplication(sys.argv)
window = DemoWindow()
window.show()
sys.exit(app.exec_())

输出如下:

小部件演示桌面应用(作者拍摄)

小部件演示桌面应用(作者拍摄)

我们已成功创建了一个集成多数常见小部件的桌面应用。为方便理解,我们在每个小部件旁都添加了标签。虽然这是个示例应用,但现在我们可以为更复杂的应用挑选并使用其中任意一种常用小部件。

使用 PySide6、Matplotlib 和 Seaborn 的数据可视化应用

要创建此应用,我们将先选取一个流行数据集并创建独立可视化。这一步类似于我们在日常数据科学工作中进行的探索性数据分析。然后我们会把这些可视化封装进桌面应用中,就像把报告和分析转变为交互式桌面应用一样。

在开始之前,请先在终端运行以下命令,确保所需库齐全。

pip3 install matplotlib seaborn

步骤 1:创建简单的独立可视化

这里,我们加载 Python 可视化包 Seaborn 中原生提供的“iris 数据集”。我们使用该包配合 Matplotlib 来创建可视化。若要全面了解如何使用 Seaborn 作图,您可以查看我们的Python Seaborn 可视化指南。

import seaborn as sns
import matplotlib.pyplot as plt
# Load the Iris dataset
iris = sns.load_dataset("iris")

随后按如下方式创建可视化:

plt.figure(figsize=(6, 4))
sns.scatterplot(data=iris, x="sepal_length", y="sepal_width", hue="species")
plt.title("Sepal Length vs Sepal Width")
plt.show()

第一个可视化是以品种着色的花萼长度与花萼宽度散点图。

可视化 #1:花萼长度 vs. 花萼宽度(作者拍摄)

可视化 #1:花萼长度 vs. 花萼宽度(作者拍摄)

第二个可视化是以品种着色的花瓣长度直方图。

plt.figure(figsize=(6, 4))
sns.histplot(iris, x="petal_length", hue="species", kde=True)
plt.title("Histogram of Petal Length")
plt.show()

输出如下:

可视化 #2:花瓣长度直方图(作者拍摄)

可视化 #2:花瓣长度直方图(作者拍摄)

最后,我们绘制一个箱线图,展示不同品种的花瓣宽度分布。

plt.figure(figsize=(6, 4))
sns.boxplot(x="species", y="petal_width", data=iris)
plt.title("Box Plot of Petal Width")
plt.show()

可视化如下:

可视化 #3:花瓣宽度箱线图(作者拍摄)

这些图为 Iris 数据集提供了不同视角的洞察,展示了各项特征在不同鸢尾花品种间的关系与分布。

步骤 2:将可视化集成到桌面应用中

首先,让我们看一下代码并理解其逻辑。

import sys
import seaborn as sns
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class IrisVisualizer(QMainWindow):
   def __init__(self):
       super().__init__()
       self.setWindowTitle("Iris Dataset Visualizations")
       self.setGeometry(100, 100, 1200, 900)  # x, y, width, height
       self.initUI()

   def initUI(self):
       central_widget = QWidget(self)
       self.setCentralWidget(central_widget)
       layout = QVBoxLayout(central_widget)

       # Adding multiple plots
       self.addScatterPlot(layout)
       self.addHistogram(layout)
       self.addBoxPlot(layout)

   def addPlotCanvas(self, layout, plot_func):
       canvas = FigureCanvas(Figure(figsize=(6, 4)))
       plot_func(canvas.figure)
       layout.addWidget(canvas)

   def addScatterPlot(self, layout):
       def scatter_plot(figure):
           iris = sns.load_dataset("iris")
           ax = figure.add_subplot(111)
           sns.scatterplot(data=iris, x="sepal_length", y="sepal_width", hue="species", ax=ax)
           ax.set_title("Sepal Length vs Sepal Width")

       self.addPlotCanvas(layout, scatter_plot)

   def addHistogram(self, layout):
       def histogram(figure):
           iris = sns.load_dataset("iris")
           ax = figure.add_subplot(111)
           sns.histplot(iris, x="petal_length", hue="species", kde=True, ax=ax)
           ax.set_title("Histogram of Petal Length")

       self.addPlotCanvas(layout, histogram)

   def addBoxPlot(self, layout):
       def box_plot(figure):
           iris = sns.load_dataset("iris")
           ax = figure.add_subplot(111)
           sns.boxplot(x="species", y="petal_width", data=iris, ax=ax)
           ax.set_title("Box Plot of Petal Width")

       self.addPlotCanvas(layout, box_plot)

# Run the application
app = QApplication(sys.argv)
window = IrisVisualizer()
window.show()
sys.exit(app.exec_())

我们围绕 IrisVisualizer 类来构建应用,该类继承自 PySide6 的 QMainWindow。它负责设置主窗口和布局,充当可视化的容器。每个图通过 Matplotlib 的 FigureCanvasQTAgg 嵌入到 GUI 中,从而将 Matplotlib 图形作为 PySide6 小部件显示。

集成的关键在于 addPlotCanvas 方法。它创建一个 Matplotlib 图形、在其上绘制图表,然后把该图形嵌入到应用布局中。addScatterPlot、addHistogram 和 addBoxPlot 等方法定义了各自的图表,它们正是我们之前的独立图。主窗口的布局使用垂直盒布局(QVBoxLayout),将所有图表垂直堆叠。

来看一下最终应用:

Iris 数据集可视化桌面应用(作者拍摄)

Iris 数据集可视化桌面应用(作者拍摄)

这是不是比在 Jupyter Notebook 里的单个图更好?当然,这只是个简单示例,但一旦理解了创建这类应用的概念,我们就能将其升级为完整的数据洞察仪表板或数据科学应用。

结语

本教程介绍了 PySide6,这一 Python 库可让数据从业者使用最熟悉的语言——Python 来创建 GUI 桌面应用。我们从安装 PySide6 并创建第一个桌面应用开始。

随后扩展至覆盖桌面应用中最常用的小部件。

最后,我们了解了如何将 Seaborn 和 Matplotlib 等流行库的可视化直接集成进 PySide6 应用。

如需进一步学习,建议参考官方文档,跟随好奇心创建您喜欢的应用。或者,您也可以查看我们的教程,使用另一个库 Tkinter 在 Python 中创建 GUI 桌面应用。

Arunn Thevapalan

作者

Arunn Thevapalan

作为一名高级数据科学家,我设计、开发并部署大规模机器学习解决方案,帮助企业做出更明智的数据驱动决策。作为数据科学写作者,我分享所学心得、职业建议以及深入的实践型教程。

主题