我在这里写了一个简短的程序来记录和回放我的鼠标动作。我在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()
经过更多的调查和研究,我发现了这个问题。将信号重新连接到插槽时,必须确保
disconnect()
以前的信号。发生的事情是:按记录。记录信号接通。 按播放。由于记录信号没有断开连接,它首先触发。然后,播放信号被连接并执行。这类行为层出不穷,这就是为什么事情表现得如此奇怪。在
相关问题 更多 >
编程相关推荐