Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5:如何向工作线程发送信号_Python_Qt_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt5:如何向工作线程发送信号

Python PyQt5:如何向工作线程发送信号,python,qt,python-3.x,pyqt,pyqt5,Python,Qt,Python 3.x,Pyqt,Pyqt5,我知道如何将信号从工作线程发送回主GUI线程,但是如何将信号从主线程发送到工作线程呢 下面是一些示例代码,其中包括信号和插槽。在这里,我将信号发送回主线程,但是我如何才能走相反的方向呢 这里的目标是发送一个信号,当我希望线程停止时,将self.do的值更改为0 这是主文件,我将把UI文件放在下面 from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMainWindow from PyQt5.QtCore import QThread,

我知道如何将信号从工作线程发送回主GUI线程,但是如何将信号从主线程发送到工作线程呢

下面是一些示例代码,其中包括信号和插槽。在这里,我将信号发送回主线程,但是我如何才能走相反的方向呢

这里的目标是发送一个信号,当我希望线程停止时,将self.do的值更改为0

这是主文件,我将把UI文件放在下面

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
from progressUI import Ui_Form

import sys
import time

class ProgressBar(QObject):
    progress = pyqtSignal(int)
    kill = pyqtSignal()

    def __init__(self, timer, parent=None):
        super(ProgressBar, self).__init__(parent)
        self.time = timer
        self.do = 1

    def work(self):

        while self.do == 1:
            y = 0
            for _ in range(100):
                time.sleep(.1)
                y += 1
                self.progress.emit(y)
            break

        self.kill.emit()

    @pyqtSlot(str)
    def worker_slot(self, sentence):
        print(sentence)

class Go(QMainWindow, Ui_Form, QObject):
    custom_signal = pyqtSignal(str)

    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.progressBar.setValue(0)
        self.startThread()

    @pyqtSlot(int)
    def updateProgress(self, val):
        self.progressBar.setValue(val)
        self.custom_signal.emit('hi from main thread')

    def startThread(self):
        self.progressThread = ProgressBar(60)
        self.thread = QThread()
        self.progressThread.moveToThread(self.thread)

        self.progressThread.progress.connect(self.updateProgress)
        self.progressThread.kill.connect(self.thread.quit)
        self.custom_signal.connect(self.progressThread.worker_slot)
        self.thread.started.connect(self.progressThread.work)

        self.thread.start()



if __name__ == '__main__':
     app = QtWidgets.QApplication(sys.argv)
     MainApp = Go()
     MainApp.show()
     sys.exit(app.exec_())
这是UI文件

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(658, 118)
        self.progressBar = QtWidgets.QProgressBar(Form)
        self.progressBar.setGeometry(QtCore.QRect(30, 40, 601, 23))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(45, 75, 581, 26))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "TextLabel"))

如何向工作线程发送信号?与从工作线程向GUI发送信号的方式完全相同。我希望它会更不一样

@三个菠萝链接到主线程和工作线程之间双向通信的极好示例

如果要在主GUI线程中创建自定义信号,则需要确保继承QObject,然后才能创建自定义信号

我在最初的帖子中更新了我的代码,以包含UI文件,这样您就可以运行它,并且我在GUI线程中包含了一个自定义信号的示例,该信号发送给工作者

但是,在for循环结束之前,您不会看到print语句的输出,因为它阻止了worker处理信号,正如@three pinepples所述


因此,尽管这不是最好的例子,但如果有人在理解这个概念时遇到同样的困难,希望这会有所帮助。

您的代码无法运行。有输入错误,我们无法访问您的UI。不,它没有运行代码。这是你要看的一个样本。好的,我看了一下,我明白了。。。这是行不通的。无论如何,是什么阻止您向工作者发送信号?请参阅,但请注意,工作者中不能有一个永远循环的函数,因为这将阻止工作者处理信号。将循环替换为其他内容(如
QTimer
,但请确保它存在于正确的线程中-其中有一些微妙之处)@squirtgun我不确定为什么链接不是您要寻找的。主线程中的信号是
clicked
信号,该信号随
QPushButton
一起出现。可以随意使用主线程中存在的任何预先存在的信号,或者在主线程中的
QObject
中定义一个新信号。插槽是辅助函数中的一种方法。因此,信号从主线程发出,并调用辅助函数中的插槽。这不是你要找的吗?该示例显示了主线程和辅助线程之间的双向通信。不知道你还想要什么?