ここでは、マウスの動きを記録して再生するように設計された短いプログラムを作成しました。私はシンプルな GUI を実装PyQt
し、過去に動作させました。最近、メインループQThread
で使用する代わりに実装することで、コードを更新して「ハック」を少なくすることにしました。processEvents()
以下のコードは実行されますが、奇妙な動作をします。コードを実行すると、次のようになります。
入力 1:レコードを押します
コンソール出力:
isRecording = True
入力 2:停止を押します
コンソール出力:
Stopped!
入力 3:再生を押します
コンソール出力:
isRecording = True
入力 4:ストップを押します
コンソール出力:
Stopped!
Play!
Playback complete!
play
プログラムを押した後に再度録音を試み、停止を押した後にのみ再生が開始される理由は不明です。さらに、この奇妙さが続いた後も、同様のタイプの出力を示し続けますが、わずかな違いがあります。
私の推測では、クラスのorメンバー関数をstarted
呼び出しているかどうかに応じて、スレッド シグナルを再割り当てすることに関係があると思います。play
record
CursorCapture
どんな洞察も大歓迎です。
コード
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()