| from pynput.keyboard import Key, KeyCode, Listener |
| from collections import defaultdict |
| from threading import Lock |
|
|
| class KeystrokeCounter(Listener): |
| def __init__(self): |
| self.key_count_map = defaultdict(lambda:0) |
| self.key_press_list = list() |
| self.lock = Lock() |
| super().__init__(on_press=self.on_press, on_release=self.on_release) |
| |
| def on_press(self, key): |
| with self.lock: |
| self.key_count_map[key] += 1 |
| self.key_press_list.append(key) |
| |
| def on_release(self, key): |
| pass |
| |
| def clear(self): |
| with self.lock: |
| self.key_count_map = defaultdict(lambda:0) |
| self.key_press_list = list() |
| |
| def __getitem__(self, key): |
| with self.lock: |
| return self.key_count_map[key] |
| |
| def get_press_events(self): |
| with self.lock: |
| events = list(self.key_press_list) |
| self.key_press_list = list() |
| return events |
|
|
| if __name__ == '__main__': |
| import time |
| with KeystrokeCounter() as counter: |
| try: |
| while True: |
| print('Space:', counter[Key.space]) |
| print('q:', counter[KeyCode(char='q')]) |
| time.sleep(1/60) |
| except KeyboardInterrupt: |
| events = counter.get_press_events() |
| print(events) |
|
|