【问题标题】:How to code a threaded keyboard event listener in Python?如何在 Python 中编写线程键盘事件侦听器?
【发布时间】:2020-07-27 23:23:52
【问题描述】:

我正在为我的 python 脚本做一个“kill switch”。本质上,当我的主脚本循环并执行它时,它在后台监听特定的按键,然后在按下该键时完全退出脚本。

我只会在主脚本中定期进行密钥检查,但是有很多睡眠和等待,并且坐在那里按住密钥直到下一次检查出现并不是很实用。

我知道如何为键盘键编写事件侦听器,我以前从未使用过线程。

我使用 pynput 以防万一可能导致与线程库不兼容。

非常感谢任何帮助。

【问题讨论】:

    标签: python multithreading background-process event-listener pynput


    【解决方案1】:

    keyboard 模块在单独的线程中捕获事件,所以它可能是您正在寻找的。​​p>

    试试这样的:

    import keyboard
    import time
    
    stop_switch = False
    
    
    def switch(keyboard_event_info):
        global stop_switch
    
        stop_switch = True
    
        keyboard.unhook_all()
        print(keyboard_event_info)
    
    
    def main_function():
        global stop_switch
    
        keyboard.on_press_key('enter', switch)
    
        while stop_switch is False:
            if stop_switch is False:
                print("1")
            if stop_switch is False:
                time.sleep(0.2)
            if stop_switch is False:
                print("2")
            if stop_switch is False:
                time.sleep(0.5)
            if stop_switch is False:
                print("3")
            if stop_switch is False:
                time.sleep(1)
    
        stop_switch = False
    
    
    main_function()
    

    几乎立即从 time.sleep() 退出的简单方法,例如 10 秒的睡眠:

    def main_function():
        global stop_switch
    
        keyboard.on_press_key('enter', switch)
    
        while stop_switch is False:
            if stop_switch is False:
                print("sleeping for 10 seconds")
                for i in range(100):
                    if stop_switch is False:
                        time.sleep(0.1)
            print("program stopped")
    
        stop_switch = False
    

    但更好的方法是使用threading.EventCheck this.

    【讨论】:

    • 这是一个很好的答案,并且绝对适用于后台听众,所以谢谢。但是我确实有另一个问题。就目前而言,例如,如果我要进行 20 秒的睡眠,当我按下键杀死脚本时,它仍然会等待完成 20 秒的睡眠,然后才会终止。我也尝试过使用 sys.exit() ,但它仍在等待当前命令完成运行后再退出。你知道一种立即杀死所有线程的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2014-04-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多