2

按 随时关闭程序的最佳方法是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()
4

2 回答 2

0

keyboard模块是多线程的,因此您不需要multiprocessing自己使用该模块来执行此操作。我认为最干净的方法是使用该keyboard.hook()函数来指定一个回调函数来执行所需的操作。

注意:由于此回调将从单独的keyboard线程调用sys.exit(),因此调用它只会退出该线程,而不是整个程序/进程。要实现这一点,您需要改为调用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()
于 2020-10-28T11:01:26.833 回答
0

编辑:这有效:

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 模块为上面的代码注册按键

于 2020-10-28T09:01:01.013 回答