按下一个键,在某个点结束Python循环

mzaanser  于 2023-06-25  发布在  Python
关注(0)|答案(3)|浏览(154)

我有一个包含多个循环的Python脚本,当我执行它时,它会无限期地继续运行,直到我手动停止它(通常是通过中断Jupyter中的内核)。虽然我一般不需要阻止它,但有时我需要。为了简化,让我们考虑以下代码:

while True:
    print("hello")
    countdown(2)
    print("hello2")
    countdown(2)
    print("hello3")
    #if F2 has been pressed, yield and error to stop the script

我想在我的Python脚本中实现以下行为:如果在执行print(“hello”)部分时按F2,脚本应该在打印print(“hello3”)后停止。类似地,如果在执行print(“hello2”)部分时按F2,脚本也应该在打印print(“hello3”)后停止。从本质上讲,我希望代码在指定的点停止,而不管我在哪里按F2。此外,我不希望脚本在每次循环迭代时提示我输入,询问是否停止脚本。这是因为我通常不需要以这种方式打断它。
我完全不知道如何实施

e37o9pze

e37o9pze1#

您可以使用pynput库创建一个等待按键的侦听器。如果监听器检测到按键,则检查是否是F2键,如果是,则设置全局停止标志。
在循环结束时,我们检查停止标志是否被设置,如果是,则退出。下面是一些示例代码:

from time import sleep
from pynput import keyboard
from pynput.keyboard import Key

def on_press(key):
    global stop_flag
    if key == Key.f2:
        stop_flag = True

listener = keyboard.Listener(on_press=on_press)
listener.start()

stop_flag = False

while True:
    print("hello")
    sleep(2)
    print("hello2")
    sleep(2)
    print("hello3")
    if stop_flag:
        break
t40tm48m

t40tm48m2#

我赞成@ShadowCrafter_01的建议,因为我非常喜欢它。
我的有点类似,但我使用的不是第三方库,而是Python的线程库。
然而,在这个acse中,我实际上宁愿使用第三方库,但无论如何,这里是我的方法:

import threading

import time

class PressKeyClass(object):
    continue_while: int = None

    def __init__(self): self.continue_while = True

    def func1(self):
        input("")
        print("detected key event")
        self.continue_while = False

def main():
    print("script start")

    bf: PressKeyClass = PressKeyClass()

    t1 = threading.Thread(target = bf.func1)

    t1.start()
    count: int = 0
    while bf.continue_while:
        print(f"count: {count} [pressing any key will abort this counting while-loop]")
        count += 1
        time.sleep(1)
    t1.join()

    print("script finished")

if __name__ == "__main__": main()

底线是;这种功能使得Python在完成任务的同时还保持跟踪其他东西(诸如事件(例如,点击事件/按键事件))需要一些排序并行性。pynput为您自动化了这一点(因此对您隐藏了这一点),而我的方法非常明确(可能是出于说教的原因)。

编辑现在我意识到,因为我使用输入法=>“任意键”的意思是[返回]

zi8p0yeb

zi8p0yeb3#

试试这个,它将从用户的键盘输入
pip install keyboard

import keyboard

while True:
    # do something
    if keyboard.is_pressed("q"):
        print("q pressed, ending loop")
        break

相关问题