Как активировать l oop только если удерживать нажатой кнопку мыши? (Остановите l oop при отпускании клавиши) PYTHON 3 - PullRequest
0 голосов
/ 19 марта 2020

У меня здесь довольно простой сценарий:

 import win32api

def press():
        lmb_status = win32api.GetKeyState(0x01)
        return lmb_status < 0

while True:
        if lmb_status():
                print ("print this")
                win32api.Sleep(1000)
                print ("do not print this")

Проблема в том, что если я нажму левую кнопку мыши, сценарий будет выполнен целиком, но моя главная цель - сценарий должен быть остановлен, как только как ключ выпущен. Поэтому, если я сделаю щелчок (и если он выпущен менее чем за секунду), он должен активировать только первую команду «print this», но не должен печатать вторую. Но он делает так, что он не работает, как я хочу, чтобы он работал.

Как я мог заставить его работать?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ 1:

После прочтения двух полезных комментариев, я думаю, что я в правильном направлении, но это все еще не работает как следует: Когда я отпускаю щелчок, происходит «Прерывание». выполняется только в том случае, если были выполнены обе команды печати.

import win32api

def click():
        left = win32api.GetKeyState(0x01)
        return left < 0
def noclick():
        left = win32api.GetKeyState(0x01)
        return left >= 0

while True:
                function = False
                win32api.Sleep(10)
                if click():
                        function = True
                elif noclick():
                        function = False
                if function == False:
                         print("Interruption.")
                if function == True:
                        print ("This should be printed.")
                        win32api.Sleep(1000)
                        print ("This should not.")

1 Ответ

0 голосов
/ 24 марта 2020

Вы можете использовать pyHook, чтобы получить событие щелчка мыши, и создать поток для запуска l oop, когда нажата левая кнопка, и завершить поток, когда кнопка нажата.

import win32api, win32gui, pyHook, pythoncom, ctypes, inspect, sys, _thread

kernel32 = ctypes.windll.kernel32
ThreadId = 0

def loop():
    while True:
        print ("This should be printed.")
        win32api.Sleep(1000)
        print ("This should not.")

def onMouse_leftdown(event):
    global ThreadId
    if(ThreadId == 0):
        print("start loop")
        ThreadId = _thread.start_new_thread(loop,())
        return True
    return True

def onMouse_leftup(event):
    global ThreadId
    if(ThreadId != 0):
        print("end loop")
        hThread = kernel32.OpenThread(0x0001, 0, ThreadId)
        ret = kernel32.TerminateThread(hThread,0)
        ThreadId = 0
        return True
    return True


if __name__ == "__main__":
    hm = pyHook.HookManager()
    hm.MouseLeftDown = onMouse_leftdown
    hm.MouseLeftUp = onMouse_leftup
    hm.HookMouse()
    pythoncom.PumpMessages()
    hm.UnhookMouse()
...