マウスボタンが押されたときに0からカウントを開始するpythonスクリプトを作成しようとしています。私の考えは、マウスの左ボタンが押されたときにpyHookを使用して関数に入り、マウスの左ボタンが離されたときに関数を終了することです。私はPythonにかなり慣れていないので、悪い説明で申し訳ありません。擬似コード:
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 が個別の時間に発生するため、うまくいかないと思います。私が探しているのは、ある種のスレッドまたはマルチプロセッシング モジュールでカウンター関数と終了関数を実行し、1 つの関数で条件を使用して、実行中の他の関数を終了することです。しかし、これを機能させる方法がわかりません。
さて、willpowerのコメントの後にこのスクリプトを試しました:
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 プロセスでは、マウス入力に基づいて 0 または 1 を Queue に入れています。counter 関数は継続的に実行され、Queue を読み取り、if ステートメントを使用してこの関数のループに入り、ループを終了します。このコードはまったく機能しませんが、その理由がわかりません。