QThread多次执行

2024-09-28 01:28:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这里写了一个简短的程序来记录和回放我的鼠标动作。我在PyQt中实现了一个简单的GUI,并且在过去一直在工作。最近,我决定通过实现QThread而不是在主循环中使用processEvents()来更新代码,以减少其“黑客性”。在

下面的代码执行,但行为异常。运行代码时,会发生以下情况:

Input 1: I press Record

Console Output:isRecording = True

Input 2: I press Stop

Console Output:Stopped!

Input 3: I press Play

Console Output:isRecording = True

Input 4: I press Stop

Console Output:Stopped!Play!Playback complete!

我不清楚为什么在按下play之后程序会再次尝试录制,而只有在按下stop之后才开始播放。此外,在经历了这段怪诞之后,它继续表现出这种类似的输出,只是略有偏差。在

我的猜测是,它与重新分配线程信号started有关,具体取决于我是否在调用play或{}成员函数。在

任何洞察力都将不胜感激。在

代码

import win32api
import sys
import time

from PyQt4 import QtGui
from PyQt4.QtCore import Qt, QPoint
from PyQt4 import QtCore

class MouseRecord(QtCore.QObject):

    finished = QtCore.pyqtSignal()    

    def __init__(self):

        super(MouseRecord, self).__init__()        

        self.isRecording = False
        self.cursorPath = []

    @QtCore.pyqtSlot()  
    def record(self):

        self.isRecording = True
        self.cursorPath = []
        print "isRecording = " + str(self.isRecording)

        while(self.isRecording):

            #print "Recording"            

            self.cursorPath.append(win32api.GetCursorPos())
            time.sleep(.02)            

        self.finished.emit()
        print "Stopped!"

    def stop(self):

        self.isRecording = False

    @QtCore.pyqtSlot()    
    def play(self):

        print "Play!"

        for pos in self.cursorPath:
            #print "Playing"            
            win32api.SetCursorPos(pos)
            time.sleep(.02)        

        print "Playback complete!"
        self.finished.emit()            


class CursorCapture(QtGui.QWidget):

    def __init__(self):

        super(CursorCapture, self).__init__()

        self.isRecording = False
        self.mouseRecorder = MouseRecord()

        self.myThread = QtCore.QThread()

        self.mouseRecorder.moveToThread(self.myThread)
        self.mouseRecorder.finished.connect(self.myThread.quit) 

        self.initUI()

    def initUI(self):

        self.recordBtn = QtGui.QPushButton("&Record")
        self.stopBtn   = QtGui.QPushButton("&Stop")
        self.playBtn   = QtGui.QPushButton("&Play")        

        self.recordBtn.clicked.connect(self.record)
        self.stopBtn.clicked.connect(self.stop)
        self.playBtn.clicked.connect(self.play)

        self.hBox = QtGui.QHBoxLayout()

        self.hBox.addWidget(self.recordBtn)
        self.hBox.addWidget(self.stopBtn)
        self.hBox.addWidget(self.playBtn)

        self.setLayout(self.hBox)

        self.setWindowTitle("Cursor Capture")
        self.show()

    def record(self):

        self.myThread.started.connect(self.mouseRecorder.record)
        self.myThread.start()        

    def stop(self):

        self.mouseRecorder.stop()

    def play(self):

        self.myThread.started.connect(self.mouseRecorder.play)
        self.myThread.start()

def main():

    qApp = QtGui.QApplication(sys.argv)

    cursorCapture = CursorCapture()

    sys.exit(qApp.exec_())    

if __name__ == "__main__":
    main()    

Tags: importselfinputplaydefconnectpressstop
1条回答
网友
1楼 · 发布于 2024-09-28 01:28:49

经过更多的调查和研究,我发现了这个问题。将信号重新连接到插槽时,必须确保disconnect()以前的信号。发生的事情是:

按记录。记录信号接通。 按播放。由于记录信号没有断开连接,它首先触发。然后,播放信号被连接并执行。这类行为层出不穷,这就是为什么事情表现得如此奇怪。在

相关问题 更多 >

    热门问题