Я пытаюсь создать скрипт python, который начинает отсчет с 0 при нажатии кнопки мыши. Моя идея - использовать pyHook для входа в функцию при нажатии левой кнопки мыши и выходе из функции при отпускании левой мыши. Я довольно новичок в python, поэтому сожалею о плохих объяснениях. Некоторые псевдокод: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 происходит в дискретном времени. То, что я ищу, возможно, запускает функцию счетчика и функцию termin в каком-то потоковом или многопроцессорном модуле и использует условия в одной функции для завершения другой выполняемой функции. Но я не уверен, как это сделать.
Хорошо, так что я попробовал этот сценарий после того, как комментарий 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 функции должен работать как отдельные процессы. В процессе mousesignal я помещаю либо 0, либо 1 в очередь на основе ввода мыши. Функция счетчика работает непрерывно и считывает очередь и использует операторы if для ввода и выхода из цикла в этой функции. Этот код не работает вообще, но я не могу понять, почему.
Просто подскажите, вы можете попробовать получить рабочий пример программы pyhook, а затем попробовать и настроить в соответствии с вашими потребностями. Как только у вас будет рабочий пример, вам будет намного легче помочь. Я бы предложил этот пример в качестве возможного места для запуска: https://gordoncluster.wordpress.com/2013/09/12/logging-all-keyboard-input-with-python-pyhook/ – willpower2727
Добавлен код рабочего счетчика. – mathiasxx94
Вы заинтересованы в том, чтобы вычислить суммарное время, когда кнопка мыши не работает? Или какой-то другой показатель подсчета? – willpower2727