マウスボタンを押したときに0からカウントを開始するpythonスクリプトを作成しようとしています。私の考えはpyHookを使用してマウスの左ボタンを押したときに関数に入り、左マウスが離されたときに関数を終了することです。私はPythonにはかなり新しいので、悪い説明をして申し訳ありません。 いくつかの擬似コード:Python:マウスダウン中にカウントダウン、マウスで停止するUp
import pyHook
import pythoncom
def termin():
return None
def counter(tell):
a=0
while True:
print a
a+=1
hm = pyHook.HookManager()
hm.SubscribeMouseLeftUp(termin)
hm = pyHook.HookManager()
hm.SubscribeMouseLeftDown(counter)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
このコードは、しかし、私はSubscribeMouseLeftUpが離散時間で起こるので、それが動作するとは思わない、私の一般的な考え方です。私が探しているのは、ある種のスレッドまたはマルチプロセッシングモジュールでcounter関数とtermin関数を実行し、ある関数で条件を使用して他の実行関数を終了させることです。しかし、私はどのようにこの仕事をするか分からない。
わかりましたので、私は意志の力さんのコメントの後に、このスクリプトを試してみました:
import pyHook,time,pythoncom
def counter(go):
for a in range(5):
time.sleep(1)
print a
return True
hm=pyHook.HookManager()
hm.SubscribeMouseLeftDown(counter)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
をwillpower2727から受け入れ答えは私がこれまで見た中で最高のソリューションです。彼は、スレッドを使用して、彼のソリューションを投稿する前に、私は次のコードを作っ:
from multiprocessing import Process,Queue
import pyHook
import time
import pythoncom
import ctypes
def counter(tellerstate,q):
while True:
a=0
tellerstate=q.get()
if tellerstate==1:
while True:
a+=1
print a
tellerstate=q.get()
if tellerstate==0:
break
time.sleep(0.1)
def mousesignal(q):
def OnDown(go):
tellstate=1
q.put(tellstate)
return None
def OnUp(go):
tellstate=0
q.put(tellstate)
return None
def terminate(go):
if chr(go.Ascii)=='q' or chr(go.Ascii)=='Q':
ctypes.windll.user32.PostQuitMessage(0)
hm.UnhookKeyboard()
hm.UnhookMouse()
q.close()
q.join_thread()
process_counter.join()
process_mousesignal.join()
return None
hm=pyHook.HookManager()
hm.KeyDown = terminate
hm.MouseLeftDown = OnDown
hm.MouseLeftUp = OnUp
hm.HookMouse()
hm.HookKeyboard()
pythoncom.PumpMessages()
if __name__ == '__main__':
tellerstate=0
q=Queue()
process_counter = Process(target=counter,args=(tellerstate,q))
process_mousesignal = Process(target=mousesignal,args=(q,))
process_mousesignal.start()
process_counter.start()
このコードの私の期待される動作は、カウンターとmousesignal機能を別々のプロセスとして実行しなければならないことです。 mousesignalプロセスでは、マウス入力に基づいてQueueに0または1のどちらかを入れます。カウンタ関数は連続的に実行され、Queueを読み込み、if関数を使用してこの関数でループを開始および終了します。このコードはまったく動作しませんが、理由を理解できません。
pyhookプログラムの実例を試してから、必要に応じて試してみてください。一度実践的な例があれば、あなたを助けてくれるはずです。私は、この例を開始する可能性のある場所として提案します:https://gordoncluster.wordpress.com/2013/09/12/logging-all-keyboard-input-with-python-pyhook/ – willpower2727
作業カウンタコードを追加しました。 – mathiasxx94
マウスボタンが押されている累積時間の計算に興味がありますか?あるいは何か他の数え方? – willpower2727