Nob*_*sMe 2 python multithreading signals-slots
这只是我的第二个问题,因此请耐心等待。我有一个目前包含两个类的python脚本。其中一个管理GUI,另一个是我的“工作线程”(pyqt线程)。为了使我能够从“工作线程”更新GUI,我理解我可以设置pyqt信号并在不同的位置发出这些信号。回到GUI线程中,我建立了connect语句,该语句应连接到GUI线程中的函数,该函数将更新GUI。
为了使此GUI更新功能知道它与GUI有什么关系,该信号还发出一个额外的参数,但未在GUI线程中接受。我想我知道为什么会这样,但是我无法弄清楚如何使其能够正常工作。
我会包含一些代码,但是可能包含了很多可能的部分,我想我会拭目以待,看看有人专门要求什么。
我希望有人可以帮助我。
编辑:谢谢您的答案很虚假-。我应该把这个放在最初的问题中,我正在使用PyQt4。我知道应该使用“ start()”来运行线程类,但是当我这样做时,程序会立即崩溃并停止工作。这导致我在初始化线程后使用“ run()”启动线程。
另外,在您的代码段中,调用updateProgressBar方法时不会直接在connect语句中传递任何参数,并且仅在定义该方法的方括号内显示该方法将接收一个参数。我已经用我的方法尝试过,但是它只是告诉我,如果您正在调用任何常规函数并且未提供必要数量的参数,您会听到什么。可能是因为我使用的是PyQt 4,或者可能是因为我直接调用了“ run()”而不是“ start()”。希望可以帮助您进一步回答我的问题。再说一次,请提及您是否要包含任何代码段。
谢谢,
波什·杰利
小智 5
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import time
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar
from PyQt5.QtCore import QThread, pyqtSignal
class Thread(QThread):
progress = pyqtSignal(int)
def __init__(self):
super(Thread, self).__init__()
def __del__(self):
self.wait()
def run(self):
for i in range(100):
time.sleep(1);
self.progress.emit(i)
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.initUI()
def initUI(self):
self.progressBar = QProgressBar(self)
self.progressBar.setValue(0)
self.thread = Thread()
self.thread.progress.connect(self.updateProgressBar)
self.thread.start()
self.setGeometry(100, 100, 200, 200)
self.setWindowTitle("Threading in PyQt5")
self.show()
def updateProgressBar(self, value):
self.progressBar.setValue(value);
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
让我们看看线程如何在PyQt5中工作。因此,首先您需要创建从QThread继承的自定义线程。在普通的初始化之后,您的主要逻辑应该写入run方法中,因为这是第一个实际上将在QThread.start()之后运行的方法(当然是在初始化之后)。因此,在编写自定义线程之后,您想在应用程序中实现它。为此,我们需要初始化您的自定义线程。没什么特别的,就像class在python中初始化任何东西一样。但是初始化线程并不意味着它已经开始。您应该使其开始。为此,我们调用start()QThread类的方法。因此,我的示例仍然是使用QThread的最简单方法。我们的下一个目标是message从我们的自定义线程。正如我们首先看到的,我们需要确定线程应该发送哪种消息(在我们的示例中为int)。在message据说是signal在PyQt5所以现在我们是我们送message过pyqtSignal。您可以__init__在自定义中看到我之前如何创建此信号Thread。所以现在要发送任何内容,signal我们只需要调用<any_signal>.emit(<message>)方法。此外,不要忘记在我们的主要逻辑中将其与某些方法绑定。在我们的例子中,我们将其绑定到self.updateProgressBar方法。因此,在run方法的每个循环中,我们的信号都会发送到self.updateProgressBar方法。有点令人困惑的是,我们不必明显声明该self.updateProgressBar方法将要获取一些参数
self.thread.progress.connect(self.updateProgressBar)
Run Code Online (Sandbox Code Playgroud)
但这仍然意味着我们的线程将向该方法发送一些信号。我知道这有点令人困惑,我的答案显然不足以了解这个强大的工具。希望我至少可以帮助您获得基础知识。
| 归档时间: |
|
| 查看次数: |
1406 次 |
| 最近记录: |