I don't have a keyboard library, but I have a pynput library, which is designed for the same purposes.
The example below is working, press the esc and space keys. How much is it thread safe? I think no.
I added processing of some events: the symbol c and C ; the alt_l key, as well as the key combination ( Alt_l+c , Alt_l+C , Alt_r+c , Alt_r+C ). Try it.
import sys from PyQt5.QtWidgets import QWidget, QApplication, QSystemTrayIcon, QStyle #import keyboard from pynput import keyboard # pip install pynput import threading class ScreenArea(QWidget): def __init__(self): super().__init__() self.setMinimumSize(500, 500) self.show() def show(w): # ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ COMBINATIONS = [ {keyboard.Key.alt_l, keyboard.KeyCode(char='c')}, # Alt_l + c {keyboard.Key.alt_l, keyboard.KeyCode(char='C')}, # Alt_l + C {keyboard.Key.alt_r, keyboard.KeyCode(char='c')}, # Alt_r + c {keyboard.Key.alt_r, keyboard.KeyCode(char='C')} # Alt_r + C ] # # ΡΠ΅ΠΊΡΡΠΈΠΉ Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ current = set() def executeAltC(): print ("\n *** ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ: Alt+C\n *** Π‘Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ :)") def get_key_name(key): """ Π€ΡΠ½ΠΊΡΠΈΡ get_key_name(), Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΈΠΏ ΠΊΠ»ΡΡΠ°. ΠΠ»Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΎΠ½ Π²Π΅ΡΠ½Π΅Ρ key.char, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΎΠ΄ΠΈΠ½Π°ΡΠ½ΡΡ
ΠΊΠ°Π²ΡΡΠ΅ΠΊ. ΠΠ»Ρ Π΄ΡΡΠ³ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ ΠΎΠ½ Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΡ ΠΊΠ»ΡΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Key.cmd, Key.alt, Key.ctrl ...) """ if isinstance(key, keyboard.KeyCode): return key.char else: return str(key) def on_press(key): key_name = get_key_name(key) if key == keyboard.Key.esc: print('--- ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡΠ°: {}'.format(key_name)) w.hide() elif key == keyboard.Key.space: print('--- ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡΠ°: {}'.format(key_name)) w.show() elif key == keyboard.Key.alt_l: print('--- ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡΠ°: {}'.format(key_name)) # KeyCode ΡΠΎΠ±ΡΡΠΈΡ Π½Π°ΠΆΠ°ΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° elif (key == keyboard.KeyCode.from_char('c')) or \ (key == keyboard.KeyCode.from_char('C')): print('--- ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡΠ°: {}'.format(key_name)) else: print('ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎ. ΠΡ Π½Π°ΠΆΠ°Π»ΠΈ: {}'.format(key_name)) current.clear() # ΠΠ»Π°Π²ΠΈΡΠΈ-ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ. Alt_l+c, Alt_l+C, Alt_r+c, Alt_r+C # any(iterable) -> bool. ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π΅ΡΡΡ Π»ΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² # Ρ
ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `ΠΈΡΡΠΈΠ½Π°` if any([key in COMBO for COMBO in COMBINATIONS]): current.add(key) if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS): executeAltC() current.clear() with keyboard.Listener(on_press=on_press) as listener: listener.join() app = QApplication(sys.argv) w = ScreenArea() threading.Thread(target=show, args=(w, ), daemon=True).start() # + daemon=True sys.exit(app.exec_())
