python 子线程与主线程共享数据_在PyQt中,在主窗口和线程之间共享数据的最佳方式是什么...

我正在用PyQt4编写我的第一个GUI应用程序,我遇到了一个看起来非常基本的问题,但我似乎没有找到一个好的答案:

我使用一个线程来连续执行一个重复的任务而不阻塞主窗口。线程需要主窗口中的一些信息(例如,数字调整框的当前值),这些信息也可以在线程运行期间更改。在这种情况下,在主窗口和线程之间共享这些数据的正确方法是什么?在

天真地说,我可以想出以下几种可能性:将对主机窗口的引用传递给线程,并使用它来检索相关变量的当前值(请参阅下面的示例)。在

在线程中保留一个变量的副本,并通过在主窗口发生变化时发出信号来保持它与主窗口的同步。在

使用全局变量。在

这三个选项很可能适用于我的特定用例(尽管2可能有点复杂),但是我觉得应该有一个更好的/更像python的/更像Qt的方法。在

下面是一个最低限度的工作示例,说明我想要做什么,在本例中使用选项1:from PyQt4 import QtGui, QtCore

import time, sys

class MainWindow(QtGui.QWidget):

def __init__(self):

super(MainWindow, self).__init__()

self.layout = QtGui.QVBoxLayout(self)

self.spinbox = QtGui.QSpinBox(self)

self.spinbox.setValue(1)

self.layout.addWidget(self.spinbox)

self.output = QtGui.QLCDNumber(self)

self.layout.addWidget(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在QT5 ,可以使用 `QThread` 类来创建线程。在线程,可以使用信号与槽机制来与线程进行通信。 以下是一个示例代码,演示了如何在线程线程之间交换图片数据: ```python from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QImage from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout import time class ImageThread(QThread): # 定义一个信号,用于传递图片数据 image_data = pyqtSignal(QImage) def __init__(self, parent=None): super(ImageThread, self).__init__(parent) def run(self): # 模拟耗时操作 time.sleep(5) # 加载图片 image = QImage('image.jpg') # 发送信号,传递图片数据 self.image_data.emit(image) class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # 创建标签,用于显示图片 self.label = QLabel(self) self.label.setAlignment(Qt.AlignCenter) self.label.setText('Loading image...') # 创建布局,并将标签添加到布局 layout = QVBoxLayout(self) layout.addWidget(self.label) # 创建线程,并将信号与槽连接起来 self.thread = ImageThread(self) self.thread.image_data.connect(self.show_image) # 启动线程 self.thread.start() def show_image(self, image): # 在标签显示图片 self.label.setPixmap(QPixmap.fromImage(image)) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在上面的代码,我们创建了一个 `ImageThread` 类,继承自 `QThread` 类。在 `run()` 方法,我们模拟了一个耗时的操作,并加载了一张图片。然后,我们通过 `image_data` 信号,将图片数据传递给线程。 在 `MainWindow` 类,我们创建了一个标签,用于显示图片。然后,我们创建了一个 `ImageThread` 对象,并将其 `image_data` 信号与 `show_image()` 槽连接起来。最后,我们启动了线程,并在 `show_image()` 方法将图片显示在标签。 注意,由于 `QImage` 和 `QPixmap` 在不同的线程之间传递时可能会出现问题,因此我们在 `show_image()` 方法使用了 `QPixmap.fromImage()` 方法将图片转换为 `QPixmap` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值