在用户想要的任何时候按 Esc 关闭程序的最佳方法是啥?

Posted

技术标签:

【中文标题】在用户想要的任何时候按 Esc 关闭程序的最佳方法是啥?【英文标题】:Best way to close the program pressing Esc anytime the user wants?在用户想要的任何时候按 Esc 关闭程序的最佳方法是什么? 【发布时间】:2021-02-10 14:42:19 【问题描述】:

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()

【问题讨论】:

顺便说一句,不要使用bool作为变量名,它是一个内置函数。 @quamrana: bool 是内置 class 的名称——但你不使用它作为变量的名称是对的。 好的,文档称它为类和函数。我以为我会在评论之前检查一下,我发现built-in function bool() 这个documentation 说它是一个类——尽管类在Python中是可调用的…… 是的,我刚刚说过。 【参考方案1】:

编辑:这可行:

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

【讨论】:

好的,这适用于该示例,但我需要能够随时退出。这意味着我在 selenium webdriver 工作时具有更长的功能,即使 webdriver 在 web 上搜索,我也希望能够退出。这就是我想使用流程的原因【参考方案2】:

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()

【讨论】:

它不起作用:它说我没有定义 exit_on_key 和 keyname 我只能假设您没有以某种方式运行我的答案中的代码,因为它不仅对我有用,而且我想不出任何解释来解释您遇到的错误。 我的错,你完全正确对不起。谢谢大家!

以上是关于在用户想要的任何时候按 Esc 关闭程序的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

防止用户在后台处理时单击表单上的任何内容的最佳方法是啥? [关闭]

电脑一直出现ESC关闭的那个界面。。。

彻底关闭通过另一个启动的应用程序的最佳方法

按 Esc 关闭任务对话框

vba中的窗口,如何用esc键实现 窗口右上角的那个关闭功能。(不添加命

webstorm快捷键