Как сделать таймер между функциями нажатия и отпускания на Pynput? - PullRequest
0 голосов
/ 09 июля 2020

Я хочу сделать таймер, который запускается, когда не нажимается никакая клавиша, а при нажатии любой клавиши таймер сбрасывается. Я действительно не знаю, как это сделать sh, но я думаю, что это возможно с помощью библиотеки потоков и времени.

КОД ОБРАЗЦА:

import threading, time
from pynput import keyboard

keys = []

def write_keys(keys):
   for key in keys:
        k = str(key).replace("'", "")
        # do some stuff here

def on_press(key):
    # the timer will reset if a key is pressed
    global keys
    keys.append(key)
    write_keys(keys)
    keys = []

def on_release(key):
    print(f'{key} was released')
    # the timer will start when no key is pressed

# Collecting events
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Другой возможный ответ с использованием библиотеки потоков и ctypes. Я бы рекомендовал это, если вы хотите продолжать делать что-то с функцией on_pressed.

import threading
from pynput import keyboard
from ctypes import Structure, windll, c_uint, sizeof, byref
from time import sleep
class LASTINPUTINFO(Structure):
    _fields_ = [
        ('cbSize', c_uint),
        ('dwTime', c_uint),
    ]

def get_idle_duration():
    while True:
        lastInputInfo = LASTINPUTINFO()
        lastInputInfo.cbSize = sizeof(lastInputInfo)
        windll.user32.GetLastInputInfo(byref(lastInputInfo))
        millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
        millis = millis / 1000.0
        print(millis)
        sleep(1) 
    #return  millis

keys = []

def write_keys(keys):
   for key in keys:
        k = str(key).replace("'", "")
        print(k)

def on_press(key):
    global keys
    keys.append(key)
    write_keys(keys)
    keys = []

listener = keyboard.Listener(on_press=on_press)
last_input_info = threading.Thread(target=get_idle_duration)
listener.start()
last_input_info.start()
listener.join()
last_input_info.join()
0 голосов
/ 09 июля 2020

Это кажется простым, приведенный ниже код напечатает секунды с момента последнего нажатия любой клавиши.

import time
from pynput import keyboard

counter_time = 0

def on_press(key):
    # the timer will reset if a key is pressed
    global counter_time
    counter_time = 0

# Collecting events
listener = keyboard.Listener(on_press=on_press)
listener.start()
while True:
    print(f"Now the time is:{counter_time} since the last time you pressed any keys")
    time.sleep(0.5)
    counter_time += 0.5
...