如何通过输入一个键来中断python中的循环但不停止循环以验证它是不是在每次执行时都输入?

Posted

技术标签:

【中文标题】如何通过输入一个键来中断python中的循环但不停止循环以验证它是不是在每次执行时都输入?【英文标题】:How to interrupt a loop in python with the input of a key but without stopping the cycle to verify if it is entered every time it is executed?如何通过输入一个键来中断python中的循环但不停止循环以验证它是否在每次执行时都输入? 【发布时间】:2022-01-20 00:07:36 【问题描述】:

while(True):

   print("Enter to the bucle")
   with open('the_file.txt', 'w') as f:
       f.write('Hello world!\n')
   f.close()

   #if at some point during the execution of this loop press the letter, for example the key q, that a break is set and the while () loop closes

我发现的问题是,如果我使用输入 () 并将键保存为字符串,那将在键盘输入等待点停止循环,但我正在寻找的是它没有它停止等待键盘输入的点,但如果在某个点按下 q,循环将结束并且不会再次执行

【问题讨论】:

这能回答你的问题吗? How to detect key presses? @ErikMcKelvey 这可能是一个部分解决方案,但在那个链接中,如果你按住键,他们所做的是取消循环,相反,如果我按下(并释放),我正在寻找那个) 运行循环并进入中断的键。换句话说,目标不是按键,而是点击一次。 请记住,即使是快速击键也需要 50 毫秒或 100 毫秒。除非您在两次检查之间间隔很长时间,否则您不会错过击键。 如果您在 Windows 上,您可以使用 msvcrt.kbhit() 来检查正在排队的键。 @MatiasNicolasRodriguez 您可以使用event.type in pygame.KEYUP 检测何时释放键。不过,这可能不是您想要的,因为 99.9% 的情况下,当您使用键盘时,事件会在按键被按下时触发。 【参考方案1】:

使用线程的示例代码。我们在后台运行任务并在另一个线程中解析用户输入的键/输入。

is_interrupt_task = True 会中断任务,否则即使主线程已经退出也不会。

代码

import logging
import threading
import time

format = '%(asctime)s: %(message)s'
logging.basicConfig(format=format, level=logging.INFO, datefmt='%H:%M:%S')


def task(name):
    logging.info(f'Thread name: starting')
    for i in range(10):
        time.sleep(i)
        logging.info(f'Thread name: sleeps for is')

    logging.info(f'Thread name: task is completed.')


if __name__ == "__main__":
    # Run task in the background.
    is_interrupt_task = True
    mytask = threading.Thread(target=task, args=(1,), daemon=is_interrupt_task)
    mytask.start()

    logging.info('starting main loop ...')
    while True:  
        userinput = input()
        command = userinput.strip()

        if command:  # almost all keys
            logging.info("main quits")
            break

        # if command == 'q':
            # logging.info("main quits")
            # break

示例任务被中断

16:12:29: Thread 1: starting
16:12:29: starting main loop ...
16:12:29: Thread 1: sleeps for 0s
16:12:30: Thread 1: sleeps for 1s
16:12:32: Thread 1: sleeps for 2s
16:12:35: Thread 1: sleeps for 3s
q
16:12:36: main quits

允许完成示例任务

is_interrupt_task = False

16:11:12: Thread 1: starting
16:11:12: starting main loop ... 
16:11:12: Thread 1: sleeps for 0s
16:11:13: Thread 1: sleeps for 1s
16:11:15: Thread 1: sleeps for 2s
16:11:18: Thread 1: sleeps for 3s
q
16:11:22: main quits
16:11:22: Thread 1: sleeps for 4s
16:11:27: Thread 1: sleeps for 5s
16:11:33: Thread 1: sleeps for 6s
16:11:40: Thread 1: sleeps for 7s
16:11:48: Thread 1: sleeps for 8s
16:11:57: Thread 1: sleeps for 9s
16:11:57: Thread 1: task is completed.

【讨论】:

非常感谢您的帮助

以上是关于如何通过输入一个键来中断python中的循环但不停止循环以验证它是不是在每次执行时都输入?的主要内容,如果未能解决你的问题,请参考以下文章

使用用户输入中断while循环(通过arduino和python 2.7控制neopixels)

如何通过识别python Hadoop中的键来处理Mapreduce

python中的循环和编码

Python shell 控制台,有个快捷键可以向dos那样通过上下键来选择之前输入的内容?

您如何防止用户通过按住刷新键来关闭您的应用程序?

如何从for循环中获取用户输入的数据到kivymd中的python文件