From b4e5150fbf37b4bb5fa0ce9f157f73c593516eb4 Mon Sep 17 00:00:00 2001 From: Stephen Argentina Date: Fri, 22 Jul 2022 11:23:12 -0400 Subject: [PATCH] Added GlobalHotKeyWithOptions class that can call a function on every key press --- lib/pynput/keyboard/__init__.py | 72 ++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/lib/pynput/keyboard/__init__.py b/lib/pynput/keyboard/__init__.py index 822602e0..d633bd5d 100644 --- a/lib/pynput/keyboard/__init__.py +++ b/lib/pynput/keyboard/__init__.py @@ -204,8 +204,8 @@ class GlobalHotKeys(Listener): """ def __init__(self, hotkeys, *args, **kwargs): self._hotkeys = [ - HotKey(HotKey.parse(key), value) - for key, value in hotkeys.items()] + HotKey(HotKey.parse(key), func) + for key, func in hotkeys.items()] super(GlobalHotKeys, self).__init__( on_press=self._on_press, on_release=self._on_release, @@ -231,3 +231,71 @@ def _on_release(self, key): """ for hotkey in self._hotkeys: hotkey.release(self.canonical(key)) + + +class GlobalHotKeysWithOptions(Listener): + """A keyboard listener supporting a number of global hotkeys. + + Same as GlobalHotKeys class with addition of an options argument for features like + 'every_press', etc + """ + def __init__(self, hotkeys, options={}, *args, **kwargs): + self._hotkeys = [ + HotKey(HotKey.parse(key), value) + for key, value in hotkeys.items()] + self._GlobalHotKeys_options = options + super(GlobalHotKeysWithOptions, self).__init__( + on_press=self._on_press, + on_release=self._on_release, + *args, + **kwargs) + + def _on_press(self, key): + try: + if 'every_press' in self._GlobalHotKeys_options: + for func in self._GlobalHotKeys_options['every_press']: + func(key) + + except TypeError: + raise TypeError(self._GlobalHotKeys_options['every_press']) + + for hotkey in self._hotkeys: + hotkey.press(self.canonical(key)) + + def _on_release(self, key): + for hotkey in self._hotkeys: + hotkey.release(self.canonical(key)) + + +class GlobalHotKeysWithOptions(Listener): + """A keyboard listener supporting a number of global hotkeys. + + Same as GlobalHotKeys class with addition of an options argument for features like + 'every_press', etc + """ + def __init__(self, hotkeys, options={}, *args, **kwargs): + self._hotkeys = [ + HotKey(HotKey.parse(key), value) + for key, value in hotkeys.items()] + self._GlobalHotKeys_options = options + super(GlobalHotKeysWithOptions, self).__init__( + on_press=self._on_press, + on_release=self._on_release, + *args, + **kwargs) + + def _on_press(self, key): + try: + if 'every_press' in self._GlobalHotKeys_options: + for func in self._GlobalHotKeys_options['every_press']: + func(key) + + except TypeError: + raise TypeError(self._GlobalHotKeys_options['every_press']) + + for hotkey in self._hotkeys: + hotkey.press(self.canonical(key)) + + def _on_release(self, key): + for hotkey in self._hotkeys: + hotkey.release(self.canonical(key))