【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

news2024/11/27 12:10:37

文章目录

  • PyQt5入门级超详细教程
    • 前言
      • 第4部分:事件处理与信号槽机制
        • 4.1 什么是信号与槽?
        • 4.2 信号与槽的基本用法
        • 4.3 信号与槽的基础示例
          • 代码详解:
        • 4.4 处理不同的信号
          • 代码详解:
        • 4.5 自定义信号与槽
          • 代码详解:
        • 4.6 信号槽的高级用法
        • 4.7 总结
      • 第5部分:文件对话框与文件处理
        • 5.1 什么是文件对话框?
          • 为什么使用 `QFileDialog`?
        • 5.2 使用 `QFileDialog` 打开文件
          • 示例 1:打开文本文件并显示内容
          • 代码详解:
        • 5.3 文件类型过滤器
        • 5.4 使用 `QFileDialog` 保存文件
          • 示例 2:保存文本到文件
          • 代码详解:
        • 5.5 多文件选择
          • 示例 3:多文件选择
          • 代码详解:
        • 5.6 总结
      • 第6部分:表格控件 QTableWidget 与数据展示
        • 6.1 什么是 QTableWidget
        • 6.2 如何创建一个简单的 QTableWidget
          • 示例 1:创建简单的表格控件
          • 代码详解:
        • 6.3 动态填充 QTableWidget
          • 示例 2:从列表动态填充表格
          • 代码详解:
        • 6.4 使用 pandas 与 QTableWidget
          • 示例 3:使用 pandas 填充 QTableWidget
          • 代码详解:
        • 6.5 从文件动态填充 QTableWidget
          • 示例 4:从 CSV 文件填充表格
          • 代码详解:
        • 6.6 总结
    • 4-6部分总结

PyQt5入门级超详细教程

前言

接序篇:【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

建议把代码复制到pycharm等IDE上面看实际效果,方便理解嗷❤️

第4部分:事件处理与信号槽机制


4.1 什么是信号与槽?

在 PyQt5 中,信号(Signal)槽(Slot) 是处理事件和交互的核心机制。信号代表某个事件的发生,而槽是信号触发后执行的函数。

  • 信号:信号是控件发出的消息,用来通知外界某个事件的发生。例如,按钮被点击时会发出一个 clicked 信号。
  • :槽是一个函数,负责响应信号。当一个信号发出时,它会调用与其关联的槽函数。

通过信号与槽机制,PyQt5 实现了控件之间的松散耦合,让事件处理更加灵活。


4.2 信号与槽的基本用法

我们可以通过以下步骤使用信号与槽机制:

  1. 创建一个控件(如按钮、文本框等)。
  2. 连接控件的信号到一个槽函数(通常是你定义的函数)。
  3. 当信号触发时,调用相应的槽函数来执行操作。

4.3 信号与槽的基础示例

示例 1:按钮点击事件

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sys

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

        self.setWindowTitle("信号与槽示例")

        # 创建一个按钮
        button = QPushButton("点击我", self)

        # 将按钮的 clicked 信号连接到自定义槽函数
        button.clicked.connect(self.button_clicked)

        # 设置按钮为中央控件
        self.setCentralWidget(button)

    def button_clicked(self):
        # 按钮点击后执行的操作
        print("按钮被点击!")

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. button.clicked.connect(self.button_clicked)
    • 这是信号与槽的核心部分。clicked 信号是 QPushButton 控件自带的信号,当按钮被点击时,信号会被触发。通过 connect() 方法,我们将这个信号连接到自定义的槽函数 button_clicked,这样当按钮被点击时,程序会执行这个槽函数。
  2. self.button_clicked()
    • 这是槽函数,它在按钮被点击时执行。这个函数中可以定义任何逻辑,比如打印消息、打开窗口或其他操作。
      在这里插入图片描述

4.4 处理不同的信号

PyQt5 中每个控件都有多个内置信号。例如,QLineEdit(文本输入框)控件有 textChanged 信号,表示文本发生了改变。

示例 2:处理文本输入框的信号

from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
import sys

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

        self.setWindowTitle("QLineEdit 信号示例")

        # 创建文本输入框
        self.line_edit = QLineEdit(self)

        # 连接文本改变的信号到自定义槽函数
        self.line_edit.textChanged.connect(self.text_changed)

        # 设置文本输入框为中央控件
        self.setCentralWidget(self.line_edit)

    def text_changed(self, text):
        # 当用户修改文本时,显示当前输入的内容
        print(f"用户输入: {text}")

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. self.line_edit.textChanged.connect(self.text_changed)
    • 这里我们连接了 QLineEdit 控件的 textChanged 信号,该信号会在用户每次修改文本时触发。每当用户输入或删除文本时,程序都会调用槽函数 text_changed
  2. self.text_changed(text)
    • 这是槽函数,参数 text 是用户当前输入的内容。当文本内容改变时,这个槽函数会被自动调用,并打印出用户输入的文本。
      在这里插入图片描述

4.5 自定义信号与槽

有时候,PyQt5 提供的内置信号并不能满足所有需求。在这种情况下,你可以自定义信号,并将它们与槽函数关联起来。

示例 3:自定义信号

from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sys

# 创建一个自定义的类,继承自 QObject
class Communicate(QObject):
    # 定义一个自定义信号
    my_signal = pyqtSignal()

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

        self.setWindowTitle("自定义信号示例")

        # 创建按钮
        button = QPushButton("触发自定义信号", self)
        button.clicked.connect(self.emit_custom_signal)  # 连接按钮点击事件

        # 创建自定义信号对象
        self.comm = Communicate()
        # 连接自定义信号到槽函数
        self.comm.my_signal.connect(self.custom_slot)

        # 设置按钮为中央控件
        self.setCentralWidget(button)

    def emit_custom_signal(self):
        # 触发自定义信号
        self.comm.my_signal.emit()

    def custom_slot(self):
        # 自定义信号触发时执行的操作
        print("自定义信号被触发!")

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. 自定义信号
    • 我们创建了一个 Communicate 类,继承自 QObject。在这个类中,我们定义了一个信号 my_signal,使用 pyqtSignal() 方法来创建。
  2. 触发自定义信号
    • 当按钮被点击时,我们调用 self.comm.my_signal.emit() 触发自定义信号。随后,这个信号会调用关联的槽函数 custom_slot
  3. 自定义槽函数
    • 当自定义信号被触发时,custom_slot() 会执行并打印消息。
      在这里插入图片描述

4.6 信号槽的高级用法
  1. 信号传递参数:大部分 PyQt5 内置信号都会传递参数。例如,textChanged 信号会传递当前文本内容,currentIndexChanged 信号会传递选中的下标。

  2. 断开信号与槽的连接:可以通过 disconnect() 方法断开信号与槽的连接。

    button.clicked.disconnect(self.button_clicked)
    

4.7 总结

在这一部分中,我们详细介绍了 PyQt5 的 信号与槽机制,这是 PyQt5 应用程序事件处理的核心。通过信号与槽机制,你可以让应用程序的控件彼此交互,实现复杂的用户界面行为。

关键点回顾:

  • 信号:表示事件的发生,例如按钮点击、文本改变等。
  • :信号触发后调用的函数,用来处理具体的逻辑。
  • 自定义信号:你可以根据需要创建自己的信号,并将它们与槽函数关联。

第5部分:文件对话框与文件处理


5.1 什么是文件对话框?

在桌面应用程序中,用户经常需要与文件系统交互,例如打开文件、保存文件、选择文件夹等。为了让用户选择文件或保存文件,PyQt5 提供了一个标准化的控件,叫做 QFileDialogQFileDialog 是一个弹出窗口,允许用户通过系统文件浏览器来选择或保存文件。

为什么使用 QFileDialog
  • 用户体验友好:用户可以通过系统的文件浏览器来选择文件,而不是手动输入路径。
  • 跨平台一致性QFileDialog 使用了操作系统的原生文件对话框,确保了跨平台的一致性。
  • 多功能性:你可以自定义文件类型过滤器,只允许用户选择特定类型的文件。

5.2 使用 QFileDialog 打开文件

我们将从如何使用 QFileDialog 打开文件并读取文件内容开始。这个过程包括:

  1. 弹出文件对话框,供用户选择文件。
  2. 读取用户选择的文件内容,并将其展示在应用程序中。
示例 1:打开文本文件并显示内容
import sys  # 系统模块,用于控制程序退出
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEdit

# 创建一个主窗口类
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法

        self.setWindowTitle("文件对话框示例")  # 设置窗口标题

        # 创建一个按钮
        self.button = QPushButton("打开文件", self)
        self.button.clicked.connect(self.open_file)  # 连接按钮点击事件

        # 创建一个文本编辑框,用于显示文件内容
        self.text_edit = QTextEdit(self)

        # 设置窗口布局
        self.setCentralWidget(self.button)  # 初始显示按钮

    # 打开文件的函数
    def open_file(self):
        # 弹出文件对话框,让用户选择文件
        file_name, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "文本文件 (*.txt);;所有文件 (*)")

        # 检查用户是否选择了文件
        if file_name:
            # 打开文件并读取内容
            with open(file_name, 'r', encoding='utf-8') as f:
                file_content = f.read()  # 读取文件内容

            # 将文件内容显示在文本编辑框中
            self.text_edit.setText(file_content)
            self.setCentralWidget(self.text_edit)  # 切换显示文本编辑框

# 创建应用程序对象
app = QApplication(sys.argv)

# 创建主窗口对象
window = MainWindow()
window.show()

# 进入应用程序事件循环
sys.exit(app.exec_())
代码详解:
  1. QFileDialog.getOpenFileName()

    • 功能:弹出一个文件对话框,让用户选择文件。它返回两个值:

      • file_name 是用户选择的文件的路径。
      • _ 是过滤器信息,我们暂时不需要用到它,因此使用 _ 来忽略。
    • 文件类型过滤器"文本文件 (*.txt);;所有文件 (*)" 表示用户只能看到 .txt 文件或所有类型的文件。我们可以根据应用场景自定义文件类型过滤器。

  2. with open(file_name, 'r', encoding='utf-8') as f:

    • 功能:打开用户选择的文件并读取内容。'r' 表示以只读模式打开文件,encoding='utf-8' 确保文件按 UTF-8 编码读取。
  3. 显示文件内容

    • 使用 QTextEdit 控件来显示读取到的文件内容。QTextEdit 是一个多行文本框,适合显示较大的文本内容。
    • self.setCentralWidget(self.text_edit):将窗口中央控件从按钮切换为文本编辑框,这样用户可以在窗口中看到文件内容。
      在这里插入图片描述

5.3 文件类型过滤器

在文件对话框中,我们可以通过文件类型过滤器限制用户只能选择特定类型的文件。例如,下面是一些常见的文件类型过滤器:

  • "文本文件 (*.txt)":只显示 .txt 文件。
  • "图片文件 (*.png *.jpg)":只显示 .png.jpg 格式的图片文件。
  • "所有文件 (*)":显示所有类型的文件。

QFileDialog 中,多个文件类型可以通过 ;; 分隔。例如:

file_name, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "图片文件 (*.png *.jpg);;所有文件 (*)")

5.4 使用 QFileDialog 保存文件

QFileDialog 不仅可以用于打开文件,还可以用于保存文件。让我们看看如何使用文件对话框来保存用户输入的内容到文件中。

示例 2:保存文本到文件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEdit

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

        self.setWindowTitle("保存文件示例")

        # 创建文本编辑框,用户可以在其中输入文本
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # 创建保存按钮
        save_button = QPushButton("保存文件", self)
        save_button.clicked.connect(self.save_file)
        self.text_edit.setFixedHeight(100)  # 设置按钮的固定高度
        self.text_edit.setFixedWidth(200)

    # 保存文件的函数
    def save_file(self):
        # 弹出保存文件对话框,选择保存路径和文件名
        file_name, _ = QFileDialog.getSaveFileName(self, "保存文件", "", "文本文件 (*.txt);;所有文件 (*)")

        # 检查用户是否选择了保存文件的路径
        if file_name:
            # 获取文本框中的内容
            file_content = self.text_edit.toPlainText()

            # 将内容写入文件
            with open(file_name, 'w', encoding='utf-8') as f:
                f.write(file_content)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. QFileDialog.getSaveFileName()
    • 功能:弹出保存文件对话框,允许用户选择保存路径和文件名。返回值 file_name 是用户选择的保存路径。如果用户取消操作,file_name 会是一个空字符串。
  2. self.text_edit.toPlainText()
    • 功能:从 QTextEdit 文本框中获取用户输入的文本。toPlainText() 方法返回的是纯文本内容,不包含格式信息。
  3. 保存文件
    • 使用 open() 函数以写入模式 ('w') 打开文件,然后将用户输入的文本写入文件。如果文件不存在,系统会自动创建该文件。
      在这里插入图片描述

5.5 多文件选择

PyQt5 的 QFileDialog 还允许用户同时选择多个文件。这在某些场景下非常有用,比如批量处理多个文件。

示例 3:多文件选择
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEdit, QVBoxLayout, QWidget

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

        self.setWindowTitle("多文件选择示例")

        # 创建按钮
        button = QPushButton("选择多个文件", self)
        button.clicked.connect(self.open_files)

        # 创建文本编辑框,用于显示选择的文件路径
        self.text_edit = QTextEdit(self)
        self.text_edit.setReadOnly(True)  # 设置为只读

        # 创建一个中央窗口部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 创建布局,并将按钮和文本编辑框添加到布局中
        layout = QVBoxLayout()
        layout.addWidget(button)
        layout.addWidget(self.text_edit)

        # 将布局应用到中央窗口部件
        central_widget.setLayout(layout)

    def open_files(self):
        # 弹出文件对话框,允许用户选择多个文件
        files, _ = QFileDialog.getOpenFileNames(self, "选择多个文件", "", "所有文件 (*)")

        if files:
            # 将所有文件路径显示在文本编辑框中
            self.text_edit.setText('\n'.join(files))

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

代码详解:
  1. QFileDialog.getOpenFileNames()
    • 功能:弹出文件对话框,允许用户同时选择多个文件。返回值 files 是用户选择的所有文件路径列表。
    • '\n'.join(files):将文件路径列表转换为字符串,每个文件路径之间用换行符分隔,以便在文本框中展示多个文件路径。
      在这里插入图片描述

在这里插入图片描述


5.6 总结

在这一部分中,我们详细讲解了 PyQt5 中如何使用 QFileDialog 来处理文件的打开、保存以及多文件选择。QFileDialog 是 PyQt5 中一个强大且常用的对话框控件,允许用户与文件系统交互。

关键点:

  • QFileDialog.getOpenFileName():用于打开文件,返回用户选择的文件路径。
  • QFileDialog.getSaveFileName():用于保存文件,允许用户选择保存路径。
  • QFileDialog.getOpenFileNames():允许用户选择多个文件,返回文件路径列表。

第6部分:表格控件 QTableWidget 与数据展示


6.1 什么是 QTableWidget

QTableWidget 是 PyQt5 提供的一个表格控件,允许你通过表格的形式展示数据。你可以将数据组织为行和列,类似于 Excel 表格或者 pandas 的 DataFrame。在应用程序中,表格控件非常适合展示结构化数据,如数据库查询结果、文件数据等。


6.2 如何创建一个简单的 QTableWidget

首先,我们来看如何手动创建一个 QTableWidget,并向其中填充一些数据。这里我们将创建一个 3 行 2 列的表格,并手动设置表头和每个单元格的数据。

示例 1:创建简单的表格控件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

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

        # 设置窗口标题
        self.setWindowTitle("QTableWidget 示例")

        # 创建一个 QTableWidget 表格,指定表格有 3 行 2 列
        self.table_widget = QTableWidget(3, 2, self)
        
        # 设置表格的表头
        self.table_widget.setHorizontalHeaderLabels(["姓名", "年龄"])

        # 填充表格的单元格数据
        self.table_widget.setItem(0, 0, QTableWidgetItem("张三"))  # 第1行第1列:张三
        self.table_widget.setItem(0, 1, QTableWidgetItem("25"))   # 第1行第2列:25
        self.table_widget.setItem(1, 0, QTableWidgetItem("李四"))  # 第2行第1列:李四
        self.table_widget.setItem(1, 1, QTableWidgetItem("30"))   # 第2行第2列:30
        self.table_widget.setItem(2, 0, QTableWidgetItem("王五"))  # 第3行第1列:王五
        self.table_widget.setItem(2, 1, QTableWidgetItem("22"))   # 第3行第2列:22

        # 将表格设置为主窗口的中央控件,表格将显示在窗口中
        self.setCentralWidget(self.table_widget)

# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()

# 进入应用程序事件循环
sys.exit(app.exec_())
代码详解:
  1. QTableWidget(3, 2)

    这一行代码创建了一个表格控件,表格有 3 行和 2 列。行数代表有多少条记录,列数代表每条记录包含多少个字段(例如姓名和年龄)。

  2. setHorizontalHeaderLabels()

    通过这行代码,我们设置了表格的表头,这里设置了两列,分别是“姓名”和“年龄”。这些列头将显示在表格的顶部,帮助用户了解每一列的数据含义。

  3. setItem(row, column, QTableWidgetItem(value))

    通过这个方法,你可以将数据插入到表格的某个单元格中。第一个参数 row 表示第几行,第二个参数 column 表示第几列,第三个参数 QTableWidgetItem(value) 表示你想要插入的具体数据。

  4. setCentralWidget(self.table_widget)

    这行代码将 QTableWidget 设置为窗口的中央控件,表格将占据窗口的主要显示区域。每个窗口只能有一个中央控件。

在这里插入图片描述


6.3 动态填充 QTableWidget

在实际应用中,表格中的数据通常不是手动输入的,而是从某个数据源(如列表、数据库或文件)动态获取的。接下来,我们演示如何根据一个列表动态填充表格的内容。

示例 2:从列表动态填充表格
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

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

        self.setWindowTitle("动态填充 QTableWidget 示例")

        # 数据源,包含姓名和年龄的列表
        data = [
            ["张三", "25"],
            ["李四", "30"],
            ["王五", "22"]
        ]

        # 根据数据源的大小动态创建表格,行数等于 data 列表的长度,列数为 2
        self.table_widget = QTableWidget(len(data), 2, self)
        self.table_widget.setHorizontalHeaderLabels(["姓名", "年龄"])

        # 使用 for 循环填充表格
        for row, (name, age) in enumerate(data):
            self.table_widget.setItem(row, 0, QTableWidgetItem(name))  # 插入姓名
            self.table_widget.setItem(row, 1, QTableWidgetItem(age))   # 插入年龄

        # 设置表格为窗口的中央控件
        self.setCentralWidget(self.table_widget)

# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. 数据源 data

    data 是一个列表,每个子列表包含一个人的姓名和年龄。在实际应用中,数据源可能来自数据库、文件或外部 API,这里我们使用静态列表作为示例。

  2. 动态创建表格

    表格的行数是由 len(data) 决定的,列数固定为 2(姓名和年龄)。这意味着如果数据源包含更多条记录,表格会自动根据数据源的大小调整行数。

  3. for 循环填充表格

    我们使用 for 循环遍历数据源,enumerate 返回每条记录的索引(row)和数据(nameage)。通过 setItem() 方法,我们将每条记录中的姓名和年龄填充到相应的行和列中。
    在这里插入图片描述


6.4 使用 pandas 与 QTableWidget

在处理大量数据时,pandas 是一个非常强大的库。它能够快速、轻松地读取 CSV 文件、Excel 文件,甚至数据库中的数据,并以 DataFrame 的形式进行操作。接下来,我们演示如何使用 pandas 读取数据,并将其展示在 QTableWidget 中。

示例 3:使用 pandas 填充 QTableWidget
import sys
import pandas as pd  # 导入 pandas 库
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

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

        self.setWindowTitle("使用 pandas 填充 QTableWidget")

        # 模拟读取的数据,通常可以通过 pd.read_csv() 或 pd.read_excel() 读取外部文件
        data_frame = pd.DataFrame({
            '姓名': ['张三', '李四', '王五'],
            '年龄': [25, 30, 22]
        })

        # 根据 pandas DataFrame 的大小创建表格
        self.table_widget = QTableWidget(data_frame.shape[0], data_frame.shape[1], self)
        self.table_widget.setHorizontalHeaderLabels(data_frame.columns)

        # 填充表格
        for row in range(data_frame.shape[0]):
            for col in range(data_frame.shape[1]):
                self.table_widget.setItem(row, col, QTableWidgetItem(str(data_frame.iat[row, col])))

        # 设置表格为中央控件
        self.setCentralWidget(self.table_widget)

# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. pandas DataFrame

    这里我们手动创建了一个 DataFrame,它包含了姓名和年龄的两列。在实际应用中,你可以通过 pd.read_csv()pd.read_excel() 或者数据库查询来获取数据。

  2. data_frame.shape

    shape 是 pandas 的一个属性,返回 DataFrame 的形状(即行数和列数)。我们通过 shape 来动态决定表格的行数和列数。

  3. data_frame.iat[row, col]

    iat 是 pandas 提供的一个方法,允许我们根据行号和列号来访问 DataFrame 中的某个具体值。通过这个方法,我们可以轻松将 DataFrame 中的每个单元格数据填充到 QTableWidget 中。

在这里插入图片描述


6.5 从文件动态填充 QTableWidget

实际应用中,数据通常来自外部文件,如 CSV 文件。接下来我们将展示如何通过 QFileDialog 选择一个 CSV 文件,并使用 pandas 读取文件内容,最后将其展示在 QTableWidget 中。

示例 4:从 CSV 文件填充表格
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QFileDialog, QPushButton

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

        self.setWindowTitle("从 CSV 文件填充 QTableWidget")

        # 创建按钮,用于选择 CSV 文件
        self.button = QPushButton("选择 CSV 文件", self)
        self.button.clicked.connect(self.open_file)

        # 设置按钮为中央控件
        self.setCentralWidget(self.button)

    def open_file(self):
        # 打开文件对话框,选择 CSV 文件
        file_name, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "CSV 文件 (*.csv);;所有文件 (*)")

        if file_name:
            # 使用 pandas 读取 CSV 文件
            data_frame = pd.read_csv(file_name)

            # 创建表格,行数和列数由 DataFrame 决定
            self.table_widget = QTableWidget(data_frame.shape[0], data_frame.shape[1], self)
            self.table_widget.setHorizontalHeaderLabels(data_frame.columns)

            # 填充表格
            for row in range(data_frame.shape[0]):
                for col in range(data_frame.shape[1]):
                    self.table_widget.setItem(row, col, QTableWidgetItem(str(data_frame.iat[row, col])))

            # 将表格设置为中央控件
            self.setCentralWidget(self.table_widget)

# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
代码详解:
  1. QFileDialog.getOpenFileName()

    这一行代码弹出了一个文件对话框,让用户选择一个 CSV 文件。file_name 是用户选择的文件路径。

  2. pd.read_csv(file_name)

    使用 pandas 读取 CSV 文件,文件内容将被加载为 DataFrame。DataFrame 是一种二维数据结构,类似于表格。

  3. QTableWidget(data_frame.shape[0], data_frame.shape[1])

    表格的行数和列数根据 DataFrame 的形状(行数和列数)动态生成。

  4. data_frame.iat[row, col]

    通过 iat 方法按行列索引获取 DataFrame 中的具体数据,并填充到 QTableWidget 的对应单元格中。


6.6 总结

在这一部分中,我们学习了如何使用 QTableWidget 来展示表格数据,并结合 pandas 来处理和展示从外部文件读取的数据。通过 pandas 的强大数据处理能力和 QTableWidget 的可视化展示功能,我们可以轻松将数据展示在应用程序中。

关键点:

  • QTableWidget 是一个强大的表格控件,适合展示结构化数据。
  • pandas 提供了灵活的数据处理能力,可以将 DataFrame 数据轻松导入到 QTableWidget 中。
  • 使用 QFileDialog 可以让用户通过文件对话框选择 CSV 文件,并将其内容展示在表格中。

4-6部分总结

在第4至第6部分中,我们深入讲解了 PyQt5 的信号与槽机制,展示了如何通过信号和槽处理用户操作事件,如按钮点击和文本输入。同时,我们介绍了 QFileDialog 控件,帮助用户与文件系统交互,进行文件的打开和保存操作。随后,我们重点讲解了 QTableWidget 控件及其与 pandas 的结合,展示了如何动态地从 CSV 文件或其他数据源加载并展示结构化数据。


以上就是关于【Python篇】PyQt5 超详细入门级教程(中篇一))的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何部署Vue+Springboot项目

很多同学在项目上线的部署遇到困难,不懂得怎么部署项目,本文将会带大家手把手从前端部署、java部署来教会大家。 如果项目涉及到了docker相关中间件的环境配置,请参看:https://blog.csdn.net/weixin_73195042/article/details/13…

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1&#xff09;在 <script setup> 中&#xff0c;emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2&#xff09;基于类型的&#xff1a; const emit defineEmits<{ (e: change, id: number): void (e: update, value: string): void }>() 说明&#x…

STM32 PWM 详解(基于 STM32F429 HAL 库)

目录 前言 一、PWM 简介 二、STM32F429 的 PWM 功能 1.定时器资源 2.PWM 模式 3.PWM原理图 三、使用 HAL 库配置 STM32F429 的 PWM 1.开启时钟 2.配置定时器 3.配置通道 4.启动定时器 5.PWM 占空比的调节 四、应用实例 五、总结 前言 在嵌入式系统开发中&#…

Python的图像算术与逻辑运算详解

一.图像加法运算 图像加法运算主要有两种方法。第一种是调用Numpy库实现&#xff0c;目标图像像素为两张图像的像素之和&#xff1b;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下&#xff1a; dst add(src1, src2[, dst[, mask[, dtype]]]) – src1表示第…

JavaScript使用地理位置 API

前言 在JavaScript中&#xff0c;Geolocation API 是一种用于访问用户地理位置的接口。这个API允许网页应用程序获取用户的位置并提供基于位置的服务。 if (navigator.geolocation)navigator.geolocation.getCurrentPosition(function () {},function () {});这个函数中需要传…

VMware Workstation v17.6 中文注册精简版

VMware Workstation Pro 是一款功能强大的桌面虚拟化软件&#xff0c;它允许用户在单一的物理机器上同时运行多个操作系统。无论是在 Windows 或 Linux 主机上&#xff0c;您都可以轻松创建和运行各种虚拟机&#xff0c;包括 Windows、Linux 以及 BSD。 全新升级&#xff0c;更…

【debug】nvidia-smi:Failed to initialize NVML: Unknown Error

今天用服务器时又突然报错cuda不可用&#xff0c;输入nvidia-smi检查&#xff0c;报错如题。 根据网上搜的原因&#xff0c;可能是因为系统内核自动升级导致与驱动版本不匹配&#xff0c;尝试重启&#xff1a;reboot&#xff0c;报错&#xff1a; 尝试 exit 退出容器再进入&am…

android framework工程师遇到成长瓶颈迷茫怎么办?千里马经验分享

背景 近来有一些framework老司机粉丝朋友发来了一些framework工作中的一些疑问&#xff0c;具体描述如下&#xff1a; 这个同学遇到的问题&#xff0c;其实就是大部分framework开发者工作比较久后遇到的一个上升瓶颈问题。 具体总结有以下几个瓶颈问题 1、framework属于系…

Qt qrc机制

文章目录 0. 前言1. qrc机制2. qrc使用 0. 前言 要设置窗口图标&#xff0c;就需要有图片及其图片所在路径&#xff0c;在本机上可能没什么问题&#xff0c;但是换了一个机器&#xff0c;路径可能不一致或者图片丢失&#xff0c;这就导致图片显示不出来。 Qt引入qrc机制&…

基于springboot+vue实现的农家乐管理系统

基于springbootvue实现的山庄农家乐管理系统前后端分离项目&#xff08;文末查看源码lw&#xff09;4-10 系统角色&#xff1a; 管理员、用户 主要功能&#xff1a; &#xff08;1&#xff09;用户关键功能包含用户注册登陆、个人信息修改、首页、农家乐、美食信息、民宿信息…

Autosar(Davinci) --- 创建一个S/R类型的port(下)

前言: 前面章节我们讲解了S/R类型的Port如何创建,这一章节,我们着重讲一下生成的代码,以及我们如何添加代码让这些门与灯之间的关系产生连接。 一、CtSaDoor.c 在【Rte.c】的【IO_TASK】中我们可以看到,反复的判断Rte_Ev_Cyclic_IO_Task_0_200ms这个条件是否成立,当200…

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRI…

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略&#xff0c;该策略要求请求的域名、协议和端口必须与提供资源的服务相同。…

828华为云征文|部署RedisStack+可视化操作

目录 1.介绍 1.1 什么是华为云Flexus X实例 1.2 什么是Redis Stack ​编辑 2 准备华为云Flexus应用服务器L实例 3 准备docker环境 4 docker 安装 Redis Stack 4.1拉取镜像 4.2 确认镜像 4.3 启动容器 4.4 放行安全组端口 4.5 操作redis 5 docker compose 配置持久 1.…

Vision Transformer(ViT)模型原理及PyTorch逐行实现

Vision Transformer(ViT)模型原理及PyTorch逐行实现 一、TRM模型结构 1.Encoder Position Embedding 注入位置信息Multi-head Self-attention 对各个位置的embedding融合&#xff08;空间融合&#xff09;LayerNorm & ResidualFeedforward Neural Network 对每个位置上单…

LabVIEW FIFO详解

在LabVIEW的FPGA开发中&#xff0c;FIFO&#xff08;先入先出队列&#xff09;是常用的数据传输机制。通过配置FIFO的属性&#xff0c;工程师可以在FPGA和主机之间&#xff0c;或不同FPGA VIs之间进行高效的数据传输。根据具体需求&#xff0c;FIFO有多种类型与实现方式&#x…

SpringSecurity原理解析(二):认证流程

1、SpringSecurity认证流程包含哪几个子流程&#xff1f; 1&#xff09;账号验证 2&#xff09;密码验证 3&#xff09;记住我—>Cookie记录 4&#xff09;登录成功—>页面跳转 2、UsernamePasswordAuthenticationFilter 在SpringSecurity中处理认证逻辑是在UsernamePas…

iOS——线程安全、线程同步与线程通信

线程安全和线程同步 线程安全&#xff1a;如果你的代码所在的进程中有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的&#xff0c;而且其他的变量的值也和预期的是一样的&#xff0c;就是线程安全的。 若每个…

18055 主对角线上的元素之和

### 思路 1. 输入一个3行4列的整数矩阵。 2. 计算主对角线上的元素之和。 3. 输出主对角线上的元素之和。 ### 伪代码 1. 初始化一个3行4列的矩阵 matrix。 2. 输入矩阵的元素。 3. 初始化一个变量 sum 为0&#xff0c;用于存储主对角线元素之和。 4. 遍历矩阵的行&#xff0c…

【Day08-IO-文件字节流】

File 1. 概述 File对象既可以代表文件、也可以代表文件夹。它封装的对象仅仅是一个路径名&#xff0c;这个路径可以存在&#xff0c;也可以不存在 构造器 说明 public File​(String pathname) 根据文件路径创建文件对象 public File​(String parent, String child) 根据…