如何使线程与 pynput 一起用于转义序列?

How do I make threading work with pynput for an escape sequence?

我已经尝试了一段时间让我的监听器工作以退出我的程序,但我让它工作的唯一方法是一个糟糕的解决方案。

这是我想要让它工作的方式:

def main():
    thread2 = threading.Thread(target=printing, args=())
    thread2.start()
    with Listener(on_release=on_release) as listener:
        listener.join()


def on_release(key):
    if key == Key.esc:
        return False

def printing():
    while True:
        print('foo bar')
        time.sleep(2)
        if not Listener.running:
            break


main()

这就是我让它工作的方式:

def main():
    with Listener(on_release=on_release) as listener:
        printing(listener)


def on_release(key):
    if key == Key.esc:
        return False

def printing():
    while True:
        print('foo bar')
        time.sleep(2)
        if not Listener.running:
            break

main()

基本的想法是不必在我的代码中的任何地方都使用侦听器,如果我为较大的项目这样做,因为让 esc 退出程序是好的。

我知道我必须使用线程,但不知道如何使用它。有人可以指出我的问题并提供解决方案吗?

我看过 Handling the keyboard,但不太明白它在说什么。我想用这个更干净的方法。

我不知道pynput,但是threading一点点。线程可以有子线程,所以你可以在 Listener 开始新的线程。像这样……我想说,但困在这里。即使父线程死了,子线程还活着!这个线程被称为僵尸线程。那我们该怎么办呢?答案是守护线程。如果活着的线程只是守护线程,守护线程就会死亡。将子线程设置为守护线程,这样父线程就一起死了。解释了这么久,但继续:

def main():
    with Listener(on_release=on_release) as listener:
        thread2 = threading.Thread(target=printing, args=(), daemon=True)
        thread2.start()
        listener.join()


def on_release(key):
    if key == Key.esc:
        return False

def printing():
    while True:
        print('foo bar')
        time.sleep(2)

if __main__ == '__main__':
    main()

它会起作用的!