boppreh / keyboard

Hook and simulate global keyboard events on Windows and Linux.
MIT License
3.76k stars 433 forks source link

an error occurs on removing a hotkey while binding one function to two keys #554

Closed songyang1995 closed 2 years ago

songyang1995 commented 2 years ago

error occurs on removing hotkey while binding one function to two keys

import keyboard

def func():
    # do something
    print("something")

remove_func1 = keyboard.add_hotkey("o", func)
remove_func2 = keyboard.add_hotkey("p", func)

# current keyboard._hotkeys
# {'o': <function keyboard.add_hotkey.<locals>.remove_()>,
#  <function keyboard.add_hotkey.<locals>.remove_()>: <function keyboard.add_hotkey.<locals>.remove_()>,
#  <function __main__.func()>: <function keyboard.add_hotkey.<locals>.remove_()>, # !!Notice here
#  'p': <function keyboard.add_hotkey.<locals>.remove_()>,
#  <function keyboard.add_hotkey.<locals>.remove_()>: <function keyboard.add_hotkey.<locals>.remove_()>}

remove_func1() # or keyboard.remove_hotkey(remove_func1) or keyboard.remove_hotkey("o")
# current keyboard._hotkeys
# {'p': <function keyboard.add_hotkey.<locals>.remove_()>,
#  <function keyboard.add_hotkey.<locals>.remove_()>: <function keyboard.add_hotkey.<locals>.remove_()>}

# !!this step raise KeyError
remove_func2() # or keyboard.remove_hotkey(remove_func2) or keyboard.remove_hotkey("p")

Traceback (most recent call last):
  File "D:\dev\python3.9\lib\site-packages\IPython\core\interactiveshell.py", line 3553, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-6-5fdece594f28>", line 1, in <module>
    remove_func2() # or keyboard.remove_hotkey(remove_func2) or keyboard.remove_hotkey("p")
  File "D:\dev\python3.9\lib\site-packages\keyboard\__init__.py", line 655, in remove_
    del _hotkeys[callback]
KeyError: <function func at 0x0000018C72CEFC18>

seems using dict.pop(key, None) to replace del dict[key] might helps