使用按键重新启动 While 循环

Restart While Loop With Keypress

我希望在使用相同的键中断后用按键重新启动 while 循环。基本上,我希望制作可以通过按键打开和关闭的 while 循环。到目前为止,我的代码通过按键停止了循环,但我不知道如何重新启动它。

import keyboard
from time import sleep

key = "right shift"

while True:
    print("Running")
    sleep(0.5)
    if keyboard.is_pressed(key):
        break

我会描述我在这里尝试过的东西,但老实说我不知道​​。

编辑:抱歉一开始不够清楚,但这就是我要找的:

If you wanted the loop to restart, then put another while loop around the current one, and put a line inside that one that waits for a keypress before it moves on to the inner loop.

我已经按照 Kyle 的建议进行操作并且效果很好,除了您必须按住键才能停止。我相信它可以通过时间来解决,这是我目前所拥有的:

import keyboard
from time import sleep

key = "right shift"

while True:
    if keyboard.is_pressed(key):
        while True:
            print("Running")
            sleep(0.5)
            if keyboard.is_pressed(key):
                    sleep(1)
                    break

如果我对你的问题的理解正确,你想 运行 while 循环直到用户按下键,然后 break 去做你代码中的其他事情,直到再次按下键。

一个选项是注册一个键盘事件处理程序,这样任何时候按下一个键,无论你在脚本中的什么位置(只要它仍然是 运行ning)一些处理函数会被叫到。

然后将 while 循环放在一个函数中,并让键盘事件处理程序调用该函数。该函数应该首先禁用/取消注册事件处理程序,然后在退出前立即重新注册它。这样函数就不会在已经 运行ning 时再次调用,但会在完成后再次响应。

如果你只是想暂停循环,你可以在 if 块中放置另一个 while 循环,等待按下一个键,然后它让外部循环继续。

如果您希望循环重新开始,则在当前循环周围放置另一个 while 循环,并在该循环内放置一行,等待按键,然后再进入内循环。

编辑:因为看起来你想要中间的那个,下面是一个基本上使用你已经在使用的技术的例子:

import keyboard
from time import sleep

key = "right shift"

while True:
    print("Running")
    sleep(0.5)
    if keyboard.is_pressed(key):
        # May need a delay here to prevent it from immediately continuing
        while True:    # Will stop the loop until you press again
            # Definitely put a delay here. Your CPU will thank you
            if keyboard.is_pressed(key): # Check if key is pressed again
                break;  # Get out of inner loop
        continue    # Go back to beginning of outer loop
                    # The continue is optional if this is the end of the loop

编辑 2:最后一个示例(尽管如果您在我给出的第一个示例中包含 continue 也会产生类似的效果)

import keyboard
from time import sleep

key = "right shift"

while True:
    while True:
        print("Running")
        sleep(0.5)
        if keyboard.is_pressed(key):
            break # Gets you out of the original loop
    # Put this at the end of the inner loop 
    # if you don't want to have to hit the key to start
    while True:    # Will stop the loop until you press again
        # Definitely put a delay here. Your CPU will thank you
        if keyboard.is_pressed(key): # Check if key is pressed again
                    break;  # Get out of inner loop

一种方法是设置一个标志:

go = True
while True:
  if go:
    print('Running...')
  sleep(0.5)
  if keyboard.is_pressed(key):
    go = not go

但是,这不是编写此类代码的好方法,因为您的程序会完全控制处理器。当 goFalse 时,这称为 "busy wait"。相反,您应该按照 Kyle 在他的回答中描述的那样了解事件处理。

keyboard 模块有更多的特性允许不同的 hooks/blockers.

只需使用keyboard.wait(key)来阻止控制流,直到按下key

import keyboard
from time import sleep

key = "right shift"

while True:
    print("Running")
    sleep(0.5)
    if keyboard.is_pressed(key):
        print('waiting for `shift` press ...')
        keyboard.wait(key)

示例交互输出:

Running
Running
Running
waiting for `shift` press ...
Running
Running
Running
Running
Running
waiting for `shift` press ...
Running
Running
Running
...