【问题标题】:Simplest method to call a function from keypress in python(3)python(3)中按键调用函数的最简单方法
【发布时间】:2013-07-25 15:35:08
【问题描述】:

我有一个 python 应用程序,其中一个函数在递归循环中运行,并在循环的每个循环中将更新的信息打印到终端,在我尝试停止此递归之前一切都很好。

在终端窗口关闭或应用程序被终止(按下 control-c)之前它不会停止,但是我对该方法不满意。

我有一个函数可以停止循环并退出程序,它永远没有机会在循环中被调用,所以我希望将它分配给一个键,以便在按下它时调用它。

将一个功能分配给一个或多个键的最简单方法是什么?

【问题讨论】:

  • “递归循环”是什么意思?
  • 就像在一个函数中调用它之后调用它自己
  • 你无限递归直到有人告诉它停止?
  • 是的,这就是我希望它运行的方式,直到用户希望它停止,如果我使用的是 gui,那没什么大不了的,我可以创建一个“停止”按钮,只分配停止我在该按钮命令上的循环的功能,但在这种情况下我不能这样做
  • 如果你只是一遍又一遍地递归,最终你会达到最大递归深度,所以不管这里的解决方案是什么,你都需要将它切换到 while True 循环。当用户按下 ctrl+c 时,您对退出函数调用是否满意?

标签: python python-3.x keypress


【解决方案1】:

你可以拦截ctrl+c信号并在那个时候调用你自己的函数而不是 退出。

import signal
import sys

def exit_func(signal, frame):
    '''Exit function to be called when the user presses ctrl+c.
    Replace this with whatever you want to do to break out of the loop.
    '''
    print("Exiting")
    sys.exit(0) # remove this if you do not want to exit here

# register your exit function to handle the ctrl+c signal
signal.signal(signal.SIGINT, exit_func)

#loop forever
while True:
    ...

您应该将sys.exit(0) 替换为对您更有用的东西。您可以在循环体之外(或只是 finally)引发异常并在其上添加 except 以执行您的清理操作。

【讨论】:

  • 我相信这就是我真正想要的,主要是我希望我的函数能够处理退出与 sigint 的默认处理,感谢您的帮助
【解决方案2】:
import keyboard
import sys
from time import sleep

def kb():
    while True:
        if keyboard.is_pressed("a"):
            print("A key was pressed")
            sys.exit(0)
        



def main():

    kb()

if __name__ == "__main__":

    main()

【讨论】:

    【解决方案3】:

    这是一些代码

    import keyboard
    import sys
    
    def kb():
        while True:
            #your code here
            if keyboard.is_pressed("a"): #replace with your key
                print("Key interrupt detected")
                #cleanup here
                sys.exit()
            #or here
    if __name__ == "__main__":
        kb()
    

    此程序检查您是否在每个循环中都按下了“A”键。如果有,则退出。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案4】:
    import keyboard
    
    def mywait():
        keyboard.read_key()
    
    def my_function():
        print("hello")
    
    def my_exit():
        quit()
    
    keyboard.add_hotkey('h', my_function)
    keyboard.add_hotkey('esc', my_exit)
    
    while True:
        mywait()
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2022-08-13
      • 2020-06-25
      • 2017-10-19
      • 2013-04-11
      • 1970-01-01
      • 2023-04-06
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多