Python 我如何在循环过程中的任意点检查按键?
我试着做一个计时器,倒计时到0,然后开始倒计时。我正在使用时间和键盘模块。 该模块来自PyPi 一切都按预期进行,我可以按下按钮关闭程序,但它只在每次迭代开始时起作用。是否有一种方法可以让它在循环运行时检查任意点的按键?我需要使用不同的模块吗 这是我的代码: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
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)的问题。答案被接受,没有争论-你的答案和我的答案是互补的,希望两者都能在适用的情况下有所帮助。毕竟,没有一个单一的、最好的解决方案。