使用按键重新启动 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
但是,这不是编写此类代码的好方法,因为您的程序会完全控制处理器。当 go
为 False
时,这称为 "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
...
我希望在使用相同的键中断后用按键重新启动 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
但是,这不是编写此类代码的好方法,因为您的程序会完全控制处理器。当 go
为 False
时,这称为 "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
...