python 中的延迟而不暂停代码?



基本上我这里有这段代码:

import win32api
import win32con
import time
from random import randint
import pythoncom
import pyHook
import sys
semaphore = False 
def OnMouseLeftUp(event): 
global semaphore
if semaphore:
return True
semaphore = True
if randint(0, 10) < 4:
time.sleep(float(randint(6,9))/1000)    
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

semaphore = False
return True

# create a hook manager
hm = pyHook.HookManager()
# set the hook
hm.HookMouse()
# waits for MouseLeftUp event
hm.MouseLeftUp = OnMouseLeftUp # Triggers OnMouseLeftUp function
# wait forever
pythoncom.PumpMessages()

我需要将win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)延迟大约 50 毫秒,但如果我使用 time.sleep,整个代码都会停止该时间。因此,鼠标钩子也会停止,所以我的电脑在这段时间内停止记录鼠标输入,这真的很烦人。我需要一种解决方案来延迟 win32api 函数而不停止整个代码。任何建议将不胜感激。

您可以使用线程和装饰器等待而不会阻塞。

下面是一个基本示例:

import threading
import functools

class Delayed(object):
def __init__(self, delay):
self.delay = delay
def __call__(self, func):
waiter = threading.Event()
@functools.wraps(func)
def wrapper(*args, **kwargs):
def _run():
waiter.wait(self.delay)
func(*args, **kwargs)
t = threading.Thread(target=_run)
t.start()
return wrapper

@Delayed(5)
def tester():
# use locks if modifying data since it uses threads
print('delayed')

if __name__ == '__main__':
tester()

最新更新