Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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 在QTimer Singleshot之后终止QThread_Python_Pyqt_Pyqt5_Signals Slots_Qthread - Fatal编程技术网

Python 在QTimer Singleshot之后终止QThread

Python 在QTimer Singleshot之后终止QThread,python,pyqt,pyqt5,signals-slots,qthread,Python,Pyqt,Pyqt5,Signals Slots,Qthread,我有个问题。我正在运行一个PyQt5表单,该表单在QThread中运行一个名为Task()(我不会深入了解其代码的详细信息,但它基本上只是向QLabel返回一个值),如下所示: class Menu(QMainWindow): def __init__(self, workers): super().__init__() self.central_widget = QWidget() self.setCentr

我有个问题。我正在运行一个PyQt5表单,该表单在QThread中运行一个名为
Task()
(我不会深入了解其代码的详细信息,但它基本上只是向
QLabel
返回一个值),如下所示:

class Menu(QMainWindow):
    def __init__(self, workers):
        super().__init__()
        self.central_widget = QWidget()               
        self.setCentralWidget(self.central_widget)    
        lay = QVBoxLayout(self.central_widget)
        self.setFixedSize(500, 350)
        Pic = QLabel(self)
        self.Total = QLabel("Total: <font color='orange'>%s</font>" % (to_check()), alignment=QtCore.Qt.AlignHCenter)
        lay.addWidget(self.Total)
        thread = QtCore.QThread(self)
        thread.start()
        self.worker = Task()
        self.worker.moveToThread(thread)
        self.worker.totalChanged.connect(self.updateTotal)
        QtCore.QTimer.singleShot(0, self.worker.dostuff)
        thread.finished.connect(self.terminate)


    @QtCore.pyqtSlot(int)
    def updateTotal(self, total):
        self.Total.setText("Total: <font color='orange'>%s</font>" % (total))  

    def terminate(self):
        print("FINISHED")
        self.worker.quit()
        self.worker.wait()
        self.close()
类菜单(QMainWindow):
定义初始化(自身、工作人员):
super()。\uuuu init\uuuuu()
self.central_widget=QWidget()
self.setCentralWidget(self.central\u小部件)
lay=QVBoxLayout(self.central\u小部件)
自设置固定大小(500350)
Pic=QLabel(自)
self.Total=QLabel(“总计:%s”%(to_check()),alignment=QtCore.Qt.AlignHCenter)
lay.addWidget(self.Total)
thread=QtCore.QThread(self)
thread.start()
self.worker=Task()
self.worker.moveToThread(线程)
self.worker.totalChanged.connect(self.updateTotal)
QtCore.QTimer.singleShot(0,self.worker.dostuff)
线程。完成。连接(自终止)
@QtCore.pyqtSlot(int)
def updateTotal(自身、总计):
self.Total.setText(“总计:%s”%(总计))
def终止(自我):
打印(“完成”)
self.worker.quit()
self.worker.wait()
self.close()
我希望程序在
Task().dostuff()
函数完成后调用
terminate
插槽(基本上终止线程和函数),但我似乎无法让它工作


我不确定如何通过
QTimer返回主函数。单次启动

应该不需要计时器。使用线程的
started
信号启动辅助线程,并向辅助线程类添加
finished
信号以退出线程:

class Task(QtCore.QObject):
    totalChanged = QtCore.pyqtSignal(int)
    finished = QtCore.pyqtSignal()

    def dostuff(self):
        # do stuff ...
        self.finished.emit()

class Menu(QtWidgets.QMainWindow):
    def __init__(self, workers):
        super().__init__()
        ...
        self.thread = QtCore.QThread()
        self.worker = Task()
        self.worker.moveToThread(self.thread)
        self.worker.totalChanged.connect(self.updateTotal)
        self.worker.finished.connect(self.thread.quit)
        self.thread.started.connect(self.worker.dostuff)
        self.thread.start()