用户随时按 Esc 关闭程序的最佳方法是什么?

Best way to close the program pressing Esc anytime the user wants?

随时按 Esc 关闭程序的最佳方法是什么? 我需要在一个重要的代码中实现这个东西,但是我的实验没有成功。

这是最后一个:

from multiprocessing import Process
import keyboard
import sys


def stop_anytime():
    bool = True
    while bool:
        try:
            if keyboard.is_pressed('Esc'):
                sys.exit()
                bool = False
        except:
            break

def print_numbers():
    for n in range(150000):
        print(n)
 

if __name__ == '__main__':
    p1 = Process(target=stop_anytime)
    p2 = Process(target=print_numbers)
    p1.start()
    p2.start()

编辑:有效:

import keyboard
import sys

def print_numbers():
    for n in range(150000):
        print(n)
        if keyboard.is_pressed('Esc'):
            sys.exit()


if __name__ == '__main__':
    print_numbers()

您必须像这样加入流程:

p1.join()
p2.join()

或者这可能只能通过线程来完成

你也可以这样做:

def print_numbers():
    for n in range(150000):
        print(n)
        if keyboard.is_pressed('Esc'):
            sys.exit()

或者甚至可能使用 pygame 模块来为上面的代码注册按键

keyboard模块是多线程的,所以你不需要自己使用multiprocessing模块来做这件事。我认为最干净的做事方式是使用 keyboard.hook() 函数来指定一个回调函数来执行所需的操作。

注意: 由于此回调将从单独的 keyboard 线程调用,因此在其中调用 sys.exit() 只会退出那个线程,而不是整个 program/process。为此,您需要改为调用 os._exit()

import keyboard
import os


def exit_on_key(keyname):
    """ Create callback function that exits current process when the key with
        the given name is pressed.
    """
    def callback(event):
        if event.name == keyname:
            os._exit(1)
    return callback


def print_numbers():
    for n in range(150000):
        print(n)


if __name__ == '__main__':

    keyboard.hook(exit_on_key('esc'))
    print_numbers()