【Python篇】PyQt5 超具体教程——由入门到精通(中篇二) ...

打印 上一主题 下一主题

主题 1093|帖子 1093|积分 3279

PyQt5超具体教程

前言

接:
【Python篇】PyQt5 超具体教程——由入门到精通(序篇)
【Python篇】PyQt5 超具体教程——由入门到精通(中篇一)
建议把代码复制到pycahrm等IDE上面看实际效果,方便明白嗷❤️

第7部分:天生图表与数据可视化


7.1 matplotlib 与 PyQt5 的连合

matplotlib 是 Python 中最常用的 2D 数据可视化库,它可以天生各种范例的图表,包括折线图、柱状图、饼图等。在 PyQt5 中,你可以使用 matplotlib 来天生图表,并将这些图表嵌入到 PyQt5 的窗口中。

7.2 在 PyQt5 中嵌入 matplotlib 图表

为了在 PyQt5 应用中显示 matplotlib 图表,我们必要使用 matplotlib 的 FigureCanvas。FigureCanvas 是一个特殊的组件,它允许将 matplotlib 的画图窗口嵌入到 PyQt5 界面中。首先,我们来看怎样在 PyQt5 窗口中嵌入一个简单的折线图。
示例 1:嵌入简单的 matplotlib 图表

  1. import sys
  2. import matplotlib.pyplot as plt
  3. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  4. from PyQt5.QtWidgets import QApplication, QMainWindow
  5. class PlotCanvas(FigureCanvas):
  6.     def __init__(self, parent=None):
  7.         fig, self.ax = plt.subplots()  # 创建一个图表对象
  8.         super().__init__(fig)  # 将图表对象传给 FigureCanvas
  9.         # 在这里绘制图表
  10.         self.plot()
  11.     def plot(self):
  12.         # 数据
  13.         x = [0, 1, 2, 3, 4, 5]
  14.         y = [10, 1, 20, 3, 40, 5]
  15.         # 绘制折线图
  16.         self.ax.plot(x, y, label='折线图示例')
  17.         # 添加标签和图例
  18.         self.ax.set_title('PyQt5 中的 matplotlib 示例')
  19.         self.ax.set_xlabel('X 轴')
  20.         self.ax.set_ylabel('Y 轴')
  21.         self.ax.legend()
  22. class MainWindow(QMainWindow):
  23.     def __init__(self):
  24.         super().__init__()
  25.         self.setWindowTitle("matplotlib 与 PyQt5 示例")
  26.         # 创建一个 PlotCanvas 对象,嵌入到 PyQt5 中
  27.         self.canvas = PlotCanvas(self)
  28.         # 设置图表作为中央控件
  29.         self.setCentralWidget(self.canvas)
  30. # 创建应用程序对象
  31. app = QApplication(sys.argv)
  32. window = MainWindow()
  33. window.show()
  34. # 进入应用程序的事件循环
  35. sys.exit(app.exec_())
复制代码
代码详解:


  • FigureCanvasQTAgg
    FigureCanvas 是 matplotlib 中的一个特殊控件,用于将 matplotlib 图表嵌入到 Qt 界面中。我们通过 FigureCanvasQTAgg 继承 FigureCanvas,并创建一个类 PlotCanvas,用于绘制图表。
  • plot() 方法
    在 plot() 方法中,我们定义了要展示的数据 x 和 y,并使用 ax.plot() 方法绘制折线图。set_title()、set_xlabel()、set_ylabel() 用于设置图表的标题和轴标签,legend() 添加图例。
  • MainWindow
    在主窗口 MainWindow 中,我们创建了 PlotCanvas 实例,并将其作为窗口的中央控件。这样,matplotlib 绘制的图表就会显示在窗口中。


7.3 动态天生图表

在某些应用场景中,图表必要根据用户的输入或数据的变化实时更新。接下来我们展示怎样在 PyQt5 中动态天生和更新 matplotlib 图表。
示例 2:动态更新图表

  1. import sys
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  5. from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
  6. class PlotCanvas(FigureCanvas):
  7.     def __init__(self, parent=None):
  8.         fig, self.ax = plt.subplots()
  9.         super().__init__(fig)
  10.     def plot(self, data):
  11.         # 清除当前图表内容
  12.         self.ax.clear()
  13.         # 重新绘制图表
  14.         self.ax.plot(data, label='随机数据')
  15.         self.ax.set_title('动态更新的图表')
  16.         self.ax.set_xlabel('X 轴')
  17.         self.ax.set_ylabel('Y 轴')
  18.         self.ax.legend()
  19.         # 刷新图表以显示新数据
  20.         self.draw()
  21. class MainWindow(QMainWindow):
  22.     def __init__(self):
  23.         super().__init__()
  24.         self.setWindowTitle("动态更新 matplotlib 图表")
  25.         # 创建一个图表画布
  26.         self.canvas = PlotCanvas(self)
  27.         # 创建按钮
  28.         self.button = QPushButton("生成随机数据", self)
  29.         self.button.clicked.connect(self.update_plot)
  30.         # 创建一个布局,将按钮和图表添加到布局中
  31.         layout = QVBoxLayout()
  32.         layout.addWidget(self.canvas)
  33.         layout.addWidget(self.button)
  34.         # 创建一个 QWidget 容器,将布局设置到容器中
  35.         container = QWidget()
  36.         container.setLayout(layout)
  37.         # 设置容器为主窗口的中央控件
  38.         self.setCentralWidget(container)
  39.     def update_plot(self):
  40.         # 生成随机数据
  41.         data = np.random.rand(10)
  42.         # 更新图表
  43.         self.canvas.plot(data)
  44. # 创建应用程序对象
  45. app = QApplication(sys.argv)
  46. window = MainWindow()
  47. window.show()
  48. # 进入应用程序的事件循环
  49. sys.exit(app.exec_())
复制代码
代码详解:


  • 动态更新图表
    在 PlotCanvas 类中,我们通过 self.ax.clear() 清除之前的画图内容,然后通过 self.ax.plot(data) 绘制新的数据,最后调用 self.draw() 刷新图表。
  • update_plot() 方法
    当用户点击按钮时,update_plot() 方法天生一组新的随机数据,并调用 self.canvas.plot(data) 更新图表。
  • 布局管理
    我们使用 QVBoxLayout() 创建一个垂直布局,将图表和按钮依次分列,并通过 setCentralWidget() 设置整个布局为窗口的中央控件。


7.4 在应用程序中展示不同范例的图表

matplotlib 支持多种范例的图表,包括折线图、柱状图、饼图等。接下来我们展示怎样在 PyQt5 中展示这些不同范例的图表。
示例 3:展示不同范例的图表

  1. import sys
  2. import matplotlib.pyplot as plt
  3. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  4. from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QVBoxLayout, QWidget
  5. class PlotCanvas(FigureCanvas):
  6.     def __init__(self, parent=None):
  7.         fig, self.ax = plt.subplots()
  8.         super().__init__(fig)
  9.     def plot_line_chart(self):
  10.         self.ax.clear()
  11.         x = [0, 1, 2, 3, 4, 5]
  12.         y = [10, 1, 20, 3, 40, 5]
  13.         self.ax.plot(x, y, label='折线图')
  14.         self.ax.set_title('折线图')
  15.         self.ax.legend()
  16.         self.draw()
  17.     def plot_bar_chart(self):
  18.         self.ax.clear()
  19.         x = ['A', 'B', 'C', 'D']
  20.         y = [5, 7, 3, 8]
  21.         self.ax.bar(x, y, label='柱状图')
  22.         self.ax.set_title('柱状图')
  23.         self.ax.legend()
  24.         self.draw()
  25.     def plot_pie_chart(self):
  26.         self.ax.clear()
  27.         sizes = [15, 30, 45, 10]
  28.         labels = ['A', 'B', 'C', 'D']
  29.         self.ax.pie(sizes, labels=labels, autopct='%1.1f%%')
  30.         self.ax.set_title('饼图')
  31.         self.draw()
  32. class MainWindow(QMainWindow):
  33.     def __init__(self):
  34.         super().__init__()
  35.         self.setWindowTitle("展示不同类型的图表")
  36.         # 创建图表画布
  37.         self.canvas = PlotCanvas(self)
  38.         # 创建一个下拉菜单供用户选择图表类型
  39.         self.combo_box = QComboBox(self)
  40.         self.combo_box.addItems(["折线图", "柱状图", "饼图"])
  41.         self.combo_box.currentIndexChanged.connect(self.update_chart)
  42.         # 创建布局,将下拉菜单和图表添加到布局中
  43.         layout = QVBoxLayout()
  44.         layout.addWidget(self.canvas)
  45.         layout.addWidget(self.combo_box)
  46.         container = QWidget()
  47.         container.setLayout(layout)
  48.         self.setCentralWidget(container)
  49.     def update_chart(self, index):
  50.         if index == 0:
  51.             self.canvas.plot_line_chart()
  52.         elif index == 1:
  53.             self.canvas.plot_bar_chart()
  54.         elif index == 2:
  55.             self.canvas.plot_pie_chart()
  56. # 创建应用程序对象
  57. app = QApplication(sys.argv)
  58. window = MainWindow()
  59. window.show()
  60. # 进入应用程序的事件循环
  61. sys.exit(app.exec_())
复制代码
代码详解:


  • 展示不同图表
    PlotCanvas 类包含了三个方法,用于展示折线图、柱状图和饼图。根据用户的选择,通过 update_chart() 方法切换不同的图表展示。
  • QComboBox
    QComboBox 是一个下拉菜单控件,允许用户选择不同的图表范例。每次选择不同的图表范例时,会触发 currentIndexChanged 信号,调用 update_chart() 方法更新图表。


7.5 总结

在这一部分中,我们学习了怎样在 PyQt5 中嵌入 matplotlib 图表,实现数据的可视化展示。通过 matplotlib 的强大功能,我们可以或许在应用程序中展示折线图、柱状图、饼图等多种范例的图表。同时,我们还展示了怎样动态更新图表,并连合用户输入来实时调整图表内容。
关键点:


  • FigureCanvas 允许将 matplotlib 图表嵌入到 PyQt5 界面中。
  • 图表可以通过 self.ax.clear() 清除旧内容,并通过 self.ax.plot() 等方法动态更新。
  • 通过用户输入或按钮点击,可以动态天生和展示不同范例的图表。

第8部分:对话框(QDialog)与用户交互


8.1 什么是 QDialog

QDialog 是 PyQt5 中的一种窗口类,用于创建对话框。这种窗口通常是弹出的,并且用于让用户完成某个操作后再关闭,比如显示提示信息、要求用户确认、或者让用户输入数据。与主窗口 QMainWindow 不同,QDialog 通常不含有菜单栏、工具栏等复杂组件。
对话框分为两类


  • 模态对话框(Modal Dialog):阻止用户在关闭对话框前与主窗口进行交互。用户必须在对话框内完成操作后才气返回主窗口。这种对话框常用于提示信息或者紧张的用户操作。
  • 非模态对话框(Non-modal Dialog):允许用户在对话框打开时仍旧与主窗口进行交互。对话框和主窗口之间的操作可以同时进行。
常见的对话框 包括:


  • 消息对话框(QMessageBox):用于向用户显示消息,如信息提示、告诫、错误等。
  • 输入对话框(QInputDialog):用于获取用户输入,如文本、数字或选项。
  • 自定义对话框(Custom Dialog):你可以根据需求创建包含多种控件的自定义对话框。

8.2 使用 QMessageBox 创建消息对话框

QMessageBox 是 PyQt5 中用于显示消息或提示信息的尺度对话框。它可以显示简单的提示信息、告诫、错误消息,以致让用户在多种选项中做出选择。
示例 1:创建简单的消息对话框

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton
  3. class MainWindow(QMainWindow):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.setWindowTitle("QMessageBox 示例")
  7.         # 创建一个按钮
  8.         self.button = QPushButton("显示消息", self)
  9.         self.button.clicked.connect(self.show_message)
  10.         # 设置按钮为窗口的中央控件
  11.         self.setCentralWidget(self.button)
  12.     def show_message(self):
  13.         # 创建消息对话框
  14.         msg_box = QMessageBox()
  15.         # 设置对话框标题
  16.         msg_box.setWindowTitle("消息")
  17.         # 设置对话框显示的文本
  18.         msg_box.setText("这是一个简单的消息对话框。")
  19.         # 设置对话框的按钮
  20.         msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)  # 添加 OK 和 Cancel 按钮
  21.         # 设置对话框的图标
  22.         msg_box.setIcon(QMessageBox.Information)  # 设置图标为信息图标
  23.         # 显示对话框并获取用户的选择
  24.         result = msg_box.exec_()
  25.         # 判断用户点击了哪个按钮
  26.         if result == QMessageBox.Ok:
  27.             print("用户点击了 OK 按钮")
  28.         else:
  29.             print("用户点击了 Cancel 按钮")
  30. # 创建应用程序对象
  31. app = QApplication(sys.argv)
  32. window = MainWindow()
  33. window.show()
  34. # 进入应用程序的事件循环
  35. sys.exit(app.exec_())
复制代码
代码详解:


  • QMessageBox
    QMessageBox 是一个尺度的对话框,用于向用户展示信息。在 PyQt5 中,QMessageBox 可以显示带有图标和按钮的消息框,并且可以或许让用户进行确认。
  • setText()
    setText() 用于设置对话框的主要信息。在这个例子中,显示的内容是“这是一个简单的消息对话框”。
  • setWindowTitle()
    setWindowTitle() 设置对话框窗口的标题,用户可以通过这个标题了解到对话框的主题。
  • setStandardButtons()
    setStandardButtons() 允许你为对话框添加常用的按钮,如 OK、Cancel、Yes、No 等。在这里,我们添加了 OK 和 Cancel 两个按钮,用户可以选择其中之一。
  • setIcon()
    setIcon() 设置对话框左侧的图标。可以选择的图标范例包括 QMessageBox.Information(信息图标)、QMessageBox.Warning(告诫图标)、QMessageBox.Critical(错误图标)等。
  • exec_()
    exec_() 是一个阻塞函数,会弹出对话框并等待用户操作。这个函数返回用户选择的按钮(如 OK 或 Cancel)。根据返回值,我们可以判定用户的操作并接纳不同的行动。


8.3 使用 QInputDialog 获取用户输入

QInputDialog 是一个尺度对话框,用于从用户处获取输入。它支持多种范例的输入,包括文本、整数、浮点数和下拉选择。
示例 2:使用 QInputDialog 获取文本输入

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QInputDialog, QPushButton
  3. class MainWindow(QMainWindow):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.setWindowTitle("QInputDialog 示例")
  7.         # 创建按钮
  8.         self.button = QPushButton("获取用户输入", self)
  9.         self.button.clicked.connect(self.get_input)
  10.         # 设置按钮为中央控件
  11.         self.setCentralWidget(self.button)
  12.     def get_input(self):
  13.         # 弹出输入对话框,获取用户输入的文本
  14.         text, ok = QInputDialog.getText(self, "输入对话框", "请输入您的姓名:")
  15.         # 如果用户点击了 OK 按钮并且输入了文本
  16.         if ok and text:
  17.             print(f"用户输入:{text}")
  18. # 创建应用程序对象
  19. app = QApplication(sys.argv)
  20. window = MainWindow()
  21. window.show()
  22. # 进入应用程序的事件循环
  23. sys.exit(app.exec_())
复制代码
代码详解:


  • QInputDialog.getText()
    QInputDialog.getText() 方法用于创建一个单行文本输入对话框,用户可以在其中输入内容。这个方法返回两个值:

    • text 是用户输入的内容。
    • ok 是一个布尔值,表现用户是否点击了 OK 按钮。如果用户点击 Cancel,ok 值为 False。

  • 获取用户输入
    当用户点击 OK 按钮并输入了内容时,程序会输出用户输入的文本。如果用户取消了输入对话框,则不会输出任何内容。


8.4 自定义对话框

除了使用尺度的消息框和输入框,PyQt5 允许你创建自定义对话框。通过自定义对话框,你可以根据需求添加任意控件,如按钮、文本框、复选框等。
示例 3:创建自定义对话框

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QLabel, QVBoxLayout, QPushButton
  3. # 自定义对话框类,继承自 QDialog
  4. class CustomDialog(QDialog):
  5.     def __init__(self):
  6.         super().__init__()
  7.         # 设置对话框的标题
  8.         self.setWindowTitle("自定义对话框")
  9.         # 创建标签控件,显示提示信息
  10.         label = QLabel("这是一个自定义对话框")
  11.         # 创建关闭按钮,点击时关闭对话框
  12.         close_button = QPushButton("关闭")
  13.         close_button.clicked.connect(self.accept)  # 调用 accept() 方法关闭对话框
  14.         # 创建布局,将标签和按钮添加到布局中
  15.         layout = QVBoxLayout()
  16.         layout.addWidget(label)
  17.         layout.addWidget(close_button)
  18.         # 设置对话框的布局
  19.         self.setLayout(layout)
  20. class MainWindow(QMainWindow):
  21.     def __init__(self):
  22.         super().__init__()
  23.         self.setWindowTitle("自定义对话框示例")
  24.         # 创建按钮,用于打开自定义对话框
  25.         self.button = QPushButton("打开自定义对话框", self)
  26.         self.button.clicked.connect(self.show_custom_dialog)
  27.         # 设置按钮为窗口的中央控件
  28.         self.setCentralWidget(self.button)
  29.     def show_custom_dialog(self):
  30.         # 创建并显示自定义对话框
  31.         dialog = CustomDialog()
  32.         # 使用 exec_() 方法显示对话框,并等待用户操作
  33.         if dialog.exec_():
  34.             print("自定义对话框已关闭")
  35. # 创建应用程序对象
  36. app = QApplication(sys.argv)
  37. window = MainWindow()
  38. window.show()
  39. # 进入应用程序的事件循环
  40. sys.exit(app.exec_())
复制代码
代码详解:


  • 自定义对话框类
    CustomDialog 类继承自 QDialog,用于创建自定义对话框。对话框的外貌和举动由你自行定义,你可以在其中添加任意控件。
  • 布局管理
    通过 QVBoxLayout(),我们将对话框中的控件(如标签和按钮)垂直分列。你可以根据必要使用不同的布局管理器来构造控件,如 QHBoxLayout(水平布局)或 QGridLayout(网格布局)。
  • accept() 方法
    当用户点击关闭按钮时,调用 accept() 方法关闭对话框。accept() 是 QDialog 的内置方法,它表现对话框的操作已被接受,并会关闭对话框。
  • exec_() 方法
    exec_() 方法用于显示对话框并等待用户操作。对话框的举动是模态的,这意味着用户必须处置惩罚完对话框后才气返回主窗口。


8.5 总结

在这一部分中,我们具体介绍了 PyQt5 中的几种对话框,包括:


  • QMessageBox:用于显示消息或提示信息的对话框。
  • QInputDialog:用于获取用户输入的对话框,支持文本、整数和浮点数输入。
  • 自定义对话框:通过继承 QDialog,你可以根据需求创建包含任意控件的对话框。
关键点:


  • 对话框可以是模态的,用户必须处置惩罚完对话框后才气返回主窗口。
  • PyQt5 提供了多种尺度对话框,资助快速实现常见的用户交互。
  • 自定义对话框非常机动,适合复杂的交互需求。

7-8部分总结:图表与对话框

在第7至第8部分中,我们探讨了怎样在 PyQt5 中使用 matplotlib 实现数据的可视化,并展示了怎样在界面中嵌入折线图、柱状图、饼图等多种图表。同时,我们介绍了 PyQt5 中的对话框,包括尺度消息对话框、输入对话框以及自定义对话框。这些对话框在用户交互中起到了紧张作用,允许用户获取提示、输入信息或确认操作。

以上就是关于【Python篇】PyQt5 超具体教程——由入门到精通(中篇二)的内容啦,各位大佬有什么题目接待在评论区指正,或者私信也行哦,您的支持是我创作的最大动力!❤️


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表