python-3.x 如何停止一个函数和退出程序运行在一个while循环按下键?

yeotifhr  于 2023-10-21  发布在  Python
关注(0)|答案(3)|浏览(133)

我需要在按下键盘键q时停止一个程序。如何在下面的代码中实现这一点?我如何忽略time.sleep并检测按键并通过打印东西退出程序?目前,只有在10秒后才能检测到按键。假设我在3秒后按q,程序没有退出。

import sys
import time

import keyboard

def hd():
    print("Hi")
    time.sleep(10)
    if keyboard.is_pressed("q"):
        print(keyboard.is_pressed("q"))
        sys.exit()

while True:
    hd()
8e2ybdfx

8e2ybdfx1#

您可以添加一个热键,而不是轮询键盘来检查是否按下了某个键。当按下热键q(或您喜欢的任何键)时,将调用触发器函数quit

import keyboard
import time
import sys

exitProgram = False

# prepare to exit the program
def quit():
    global exitProgram
    exitProgram=True
    
# set hotkey    
keyboard.add_hotkey('q', lambda: quit())

# main loop to do things
while not exitProgram:
    print("Hello")
    time.sleep(1)
    
print("bye bye")
sys.exit()
7uzetpgm

7uzetpgm2#

time.sleep()是阻塞调用。程序运行时不会发生任何事情。
缩短间隔。例如,不是睡10秒,而是睡100 × 0.1秒。

import sys
import time

import keyboard

def hd():
    print("Hi")
    for _ in range(100):
        time.sleep(0.1)
        if keyboard.is_pressed("q"):
            print(keyboard.is_pressed("q"))
            sys.exit()

while True:
    hd()

对于更复杂的行为(在执行实际工作的同时还侦听键盘事件),您将不得不考虑多线程。

8zzbczxx

8zzbczxx3#

如果你把主线程的pid发送给按键回调函数,你可以在子线程中杀死主线程,就像这样:

import os
from time import sleep

import keyboard
import psutil

def on_space():
    print('space was pressed')

def on_x(main_pid):
    print('x was pressed')
    psutilKill(main_pid)

def psutilKill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        print(f"kill{proc}")
        proc.kill()
    print(f"kill{process}")
    process.kill()

def sleepT(sleepSeconds, msg=""):
    """
    带有倒计时和提示信息的sleep
    """
    while sleepSeconds > 0:
        print(f"\r{msg} sleeping…… %2d 秒" % sleepSeconds, end='')
        sleep(1)
        sleepSeconds = sleepSeconds - 1
    print()

def main():
    main_pid = os.getpid()
    keyboard.add_hotkey('space', on_space)
    keyboard.add_hotkey('x', on_x, args=[main_pid])
    sleepT(100000)

if __name__ == '__main__':
    main()

相关问题