在python中循环执行中停止

2024-10-03 00:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在执行过程中停止while循环,如果我在执行过程中反转“runWhile”的值,它只会等待它结束

问题:每当我按键盘上的f10键时,我需要它立即停止

from pynput import keyboard
import threading
import datetime, time

def exec():
    while runWhile:
        print("There I go")
        time.sleep(3)
        print("I overtaken")
        time.sleep(3)
        print("You cant stop me until I finish")
        
def on_press(key):
    global runWhile # inform function to assign (`=`) to external/global `running` instead of creating local `running`

    if key == keyboard.Key.f5:
        runWhile = True
        t = threading.Thread(target=exec)
        t.start()
    if key == keyboard.Key.f10:
        # to stop loop in thread
        print("loading STOPPED", datetime.datetime.now()) #, end='\r')
        runWhile = False

    if key == keyboard.Key.f11:
        # stop listener
        print("listener TERMINATED", datetime.datetime.now()) #, end='\r')
        return False
        
        
#--- main ---
with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

Im using pynput, docs here

^{}


Tags: tokeyimportdatetimeiftimeon过程
1条回答
网友
1楼 · 发布于 2024-10-03 00:27:06

这是我提出的一个解决方案。我创建了自己的延迟函数,如下所示:

def delay(amount): #delay time in seconds
    for i in range(int(amount*60)):
        time.sleep(0.01)
        if runWhile == False:
            return True
            break

您将用以下内容替换您的延迟(3)

if delay(3):
    break

这将等待3秒钟,但是如果在此期间runWhile为false,它将中断循环。您的代码如下所示:

from pynput import keyboard
import threading
import datetime, time

def delay(amount): #delay time in seconds
    for i in range(int(amount*60)):
      time.sleep(0.01)
      if runWhile == False:
        return True
        break

def exec():
    while runWhile:
        print("There I go")
        if delay(3):
          break
        print("I overtaken")
        if delay(3):
          break
        print("You cant stop me until I finish")
        
def on_press(key):
    global runWhile # inform function to assign (`=`) to external/global `running` instead of creating local `running`

    if key == keyboard.Key.f5:
        runWhile = True
        t = threading.Thread(target=exec)
        t.start()
    if key == keyboard.Key.f10:
        # to stop loop in thread
        print("loading STOPPED", datetime.datetime.now()) #, end='\r')
        runWhile = False

    if key == keyboard.Key.f11:
        # stop listener
        print("listener TERMINATED", datetime.datetime.now()) #, end='\r')
        return False
        
        
# - main  -
with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

相关问题 更多 >