在没有暂停代码的情况下延迟python?

时间:2017-08-23 21:29:08

标签: python winapi

基本上我在这里有这个代码:

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,那么整个代码都会被停止。因此,鼠标Hook也会停止,因此我的计算机停止记录那段时间的鼠标输入,这真的很烦人。我需要一个解决方案来延迟win32api函数而不停止整个代码。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

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

这是一个基本的例子:

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