0

ここでは、マウスの動きを記録して再生するように設計された短いプログラムを作成しました。私はシンプルな GUI を実装PyQtし、過去に動作させました。最近、メインループQThreadで使用する代わりに実装することで、コードを更新して「ハック」を少なくすることにしました。processEvents()

以下のコードは実行されますが、奇妙な動作をします。コードを実行すると、次のようになります。

入力 1:レコードを押します

コンソール出力: isRecording = True

入力 2:停止を押します

コンソール出力: Stopped!

入力 3:再生を押します

コンソール出力: isRecording = True

入力 4:ストップを押します

コンソール出力: Stopped! Play! Playback complete!

playプログラムを押した後に再度録音を試み、停止を押した後にのみ再生が開始される理由は不明です。さらに、この奇妙さが続いた後も、同様のタイプの出力を示し続けますが、わずかな違いがあります。

私の推測では、クラスのorメンバー関数をstarted呼び出しているかどうかに応じて、スレッド シグナルを再割り当てすることに関係があると思います。playrecordCursorCapture

どんな洞察も大歓迎です。

コード

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()    
4

1 に答える 1

0

さらに調査して遊んだ後、問題を発見しました。信号をスロットに再接続するときはdisconnect()、以前の信号を確認する必要があります。何が起こっていたのですか:

レコードを押します。記録信号が接続されています。再生を押します。レコード信号が切断されていないため、最初に発火します。次に、再生信号が接続されて実行されます。この種の行動は積み重ねられ、これが物事が非常に奇妙な行動をとっていた理由です.

于 2013-01-18T01:59:02.037 に答える