• pyqt---子线程进行gui操作导致界面崩溃


    PyQt(或 Qt 通常)中,您不能直接在子线程中执行与 GUI 相关的操作。这可能会导致应用程序崩溃或不可预测的行为。所有与 GUI 相关的操作都应该在主线程中执行。

    如果您需要在子线程完成某些操作后显示一个消息框,可以使用 PyQt 提供的信号和槽机制来在主线程中执行 GUI 更新。以下是如何实现这个机制的示例:

    1. 在您的线程类中定义一个信号。

    1. from PyQt5.QtCore import pyqtSignal, QThread
    2. class YourThread(QThread):
    3.     show_warning_signal = pyqtSignal(str, str, str)
    4.     def run(self):
    5.         # ... 执行其他线程操作 ...
    6.         # 当您需要显示消息框时,发出信号,而不是直接显示消息框
    7.         kind = "0"
    8.         name = "1"
    9.         tunnel = "2"
    10.         self.show_warning_signal.emit(kind, name, tunnel)

    2. 在您的主窗口或相应的类中,将该信号连接到一个槽函数。

    1. class YourMainWindow(QWidget):
    2.     def __init__(self):
    3.         super().__init__()
    4.         
    5.         self.thread = YourThread()
    6.         self.thread.show_warning_signal.connect(self.display_warning)
    7.     def display_warning(self, kind, name, tunnel):
    8.         msg_box = QMessageBox()
    9.         msg_box.setIcon(QMessageBox.Warning)
    10.         msg_box.setWindowTitle("导入配置错误")
    11.         msg_box.setText(f"导入文件-{kind}-{name}-通道-{tunnel}-不在当前读取通道中")
    12.         msg_box.exec()

    通过上述方法,您可以确保消息框的显示是在主线程中完成的,从而避免了由于直接在子线程中进行 GUI 操作而导致的崩溃。

    另一种创建线程方法的使用方式

    如果您使用 Python 的内置 `threading` 模块来创建线程,而不是使用 PyQt 的 `QThread`,您仍然必须确保 GUI 相关的操作(例如显示消息框)仅在主线程中执行。在 PyQt 中,直接从非主线程修改 GUI 是不安全的。

    即使您使用 `threading.Thread`,仍可以使用 PyQt 的信号和槽机制来安全地更新 GUI。以下是如何实现这种机制的步骤:

    1. 定义一个信号:

    1. from PyQt5.QtCore import pyqtSignal, QObject
    2. class GUIUpdater(QObject):
    3.     show_warning_signal = pyqtSignal(str, str, str)

    2. 在您的主窗口或相应的类中,将该信号连接到一个槽函数:

    1. class YourMainWindow(QWidget):
    2.     def __init__(self):
    3.         super().__init__()
    4.         self.gui_updater = GUIUpdater()
    5.         self.gui_updater.show_warning_signal.connect(self.display_warning)
    6.         self.thread_Data_reception = threading.Thread(target=self.Data_reception)
    7.         self.thread_Data_reception.start()
    8.     def Data_reception(self):
    9.         # ... 执行其他线程操作 ...
    10.         # 当您需要显示消息框时,发出信号,而不是直接显示消息框
    11.         kind = "0"
    12.         name = "1"
    13.         tunnel = "2"
    14.         self.gui_updater.show_warning_signal.emit(kind, name, tunnel)
    15.     def display_warning(self, kind, name, tunnel):
    16.         msg_box = QMessageBox()
    17.         msg_box.setIcon(QMessageBox.Warning)
    18.         msg_box.setWindowTitle("导入配置错误")
    19.         msg_box.setText(f"导入文件-{kind}-{name}-通道-{tunnel}-不在当前读取通道中")
    20.         msg_box.exec()

    这种方法的关键是使用 `pyqtSignal` 来安全地跨线程通信,并确保 GUI 更新始终在主线程中执行。

  • 相关阅读:
    10-2 Prometheus本地存储机制,单机远端存储
    二十、TCP 如何保证消息的可靠性和顺序性(干货版)
    前端基础之《ECMAScript 6(7)—异步技术》
    注意!11月PMP考试时间已定!
    Java集合---Map
    Python解决多个服务线程/进程重复运行定时任务的问题
    ETCD数据库源码分析——gRPC 拦截器
    安装MySQL Sample Database
    记一次某制造业ERP系统 CPU打爆事故分析
    索尼 toio™ 应用创意开发征文互动小企鹅
  • 原文地址:https://blog.csdn.net/qq_25368751/article/details/133635582