Python 我如何在循环过程中的任意点检查按键?

Python 我如何在循环过程中的任意点检查按键?,python,keyboard,Python,Keyboard,我试着做一个计时器,倒计时到0,然后开始倒计时。我正在使用时间和键盘模块。 该模块来自PyPi 一切都按预期进行,我可以按下按钮关闭程序,但它只在每次迭代开始时起作用。是否有一种方法可以让它在循环运行时检查任意点的按键?我需要使用不同的模块吗 这是我的代码: import time import keyboard m = 2 s = 0 count_down = True while True: if keyboard.is_pressed('q'): break

我试着做一个计时器,倒计时到0,然后开始倒计时。我正在使用时间和键盘模块。 该模块来自PyPi

一切都按预期进行,我可以按下按钮关闭程序,但它只在每次迭代开始时起作用。是否有一种方法可以让它在循环运行时检查任意点的按键?我需要使用不同的模块吗

这是我的代码:

import time
import keyboard

m = 2
s = 0
count_down = True

while True:
    if keyboard.is_pressed('q'):
        break
    print(f"{m} minutes, {s} seconds")
    if count_down:
        if s == 0:
            m -= 1
            s = 60
        s -= 1
    elif not count_down:
        s += 1
        if s == 60:
            m += 1
            s = 0
    if m == 0 and s == 0:
        count_down = False
    time.sleep(1)

在这种情况下,使用回调是常见的方法,以下是解决方案:

导入时间
输入键盘
m=2
s=0
倒计时=真
中断循环标志=错误
def句柄_q_按钮():
打印('q按下')
全局中断循环标志
中断循环标志=真
键盘。添加热键('q',手柄按钮)
尽管如此:
如果断开\u循环\u标志:
打破
打印(f“{m}分钟,{s}秒”)
如果倒计时:
如果s==0:
m-=1q
s=60
s-=1
如果不倒计时:
s+=1
如果s==60:
m+=1
s=0
如果m==0且s==0:
倒计时=错误
时间。睡眠(1)

< /代码> 如果您想并行地做任何两件事,而不是独立于另一件事,则需要考虑使用<代码>多重处理< /代码>。但是,即使您这样做了,您的循环仍然需要检查密钥是否已在其他进程中注册,或者您需要强制终止运行循环的进程,这可能会导致意外结果

但是,在您的情况下,由于没有像写入文件那样的副作用,这将起作用:

import time
import keyboard
from multiprocessing import Process


def print_loop():
    m = 2
    s = 0
    count_down = True

    while True:
        print(f"{m} minutes, {s} seconds")
        if count_down:
            if s == 0:
                m -= 1
                s = 60
            s -= 1
        elif not count_down:
            s += 1
            if s == 60:
                m += 1
                s = 0
        if m == 0 and s == 0:
            count_down = False
        time.sleep(1)


def main():
    p = Process(target=print_loop)
    p.start()
    # this loop runs truly in parallel with the print loop, constantly checking
    while True:
        if keyboard.is_pressed('q'):
            break
    # force the print loop to stop immediately, without finishing the current iteration
    p.kill()


if __name__ == '__main__':
    main()

Python的标准库不包括
键盘
模块。你想用哪一个第三方模块?键盘模块就是这个:有没有更好的选择我应该用?这仍然只是在循环开始时检查-这不是OP的问题吗?@Grismar。。哦。。我误解了你的问题,没关系。。但是,你的代码在我的电脑上仍然无法正常工作。你说的“你的代码”是什么意思?你是指我在回答OP的问题时提供的代码?它怎么不起作用?也许在那里发表评论?@Grismar:break_loop_flag
可以在循环中的任何时候进行检查,因此尽管使用示例在开始时只执行一次,但它所建议的回调技术确实回答了IMO(显然还有OP)的问题。答案被接受,没有争论-你的答案和我的答案是互补的,希望两者都能在适用的情况下有所帮助。毕竟,没有一个单一的、最好的解决方案。