使用按键重新启动While循环

时间:2019-08-16 19:28:28

标签: python while-loop keypress restart

我希望在使用相同的键退出操作后,通过按键重新启动while循环。基本上,我正在寻找可以通过按键打开和关闭的while循环。到目前为止,我的代码仅通过按键即可停止循环,但是我不知道如何再次启动循环。

import keyboard
from time import sleep

key = "right shift"

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

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

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

  

如果您希望循环重新开始,请再放置一个while循环   当前的那一行,并在其中一行中等待一行   在进入内循环之前先按下键。

我已经完成了凯尔(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

3 个答案:

答案 0 :(得分:2)

keyboard模块具有更多功能,允许使用不同的挂钩/阻止程序。

只需使用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
...

答案 1 :(得分:1)

如果我正确理解了您的问题,则希望运行while循环,直到用户按下该键,然后再中断代码中的其他操作,直到再次按下该键为止。

一个选择是注册一个键盘事件处理程序,以便无论何时您在脚本中的任何位置(只要它仍在运行),只要您按下某个键,都将调用某些处理程序函数。

然后将while循环放入函数中,并让键盘事件处理程序调用该函数。该功能应首先禁用/注销事件处理程序,然后在退出前立即重新注册。这样,该函数在运行时不会再次调用,但是在完成后将再次响应。

如果只想暂停循环,则可以在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

答案 2 :(得分:1)

执行此操作的一种方法是设置一个标志:

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

但是,这不是编写此类代码的好方法,因为您的程序可以完全控制处理器。当goFalse时,这称为“忙等待”。相反,您应该了解凯尔在其回答中描述的事件处理。