在 Python 循环中检查是否有按键暂停程序

问题描述 投票:0回答:1

我目前正在创建一个网络抓取工具来收集我正在从事的项目的数据。然而,我使用的抓取工具使用 Selenium Webdriver 和 Pyautogui,这意味着我在计算机处于活动状态时无法真正使用它。我想做的是有一个功能,当我想使用我的计算机做其他事情时,通过按键(或其他简单的东西)暂停我的程序,然后通过简单的输入恢复我的程序。

我遇到的问题是我希望在程序的每个循环开始时发生这种暂停。这个循环需要很长时间,并且检查按键并没有按照我的预期进行。这也不必是按键。我只是想要一种方法来阻止代码运行,以便我可以在白天执行其他任务,然后在我不在办公桌前时让代码运行。这是我想要实现的类似示例:

import time

paused = False

def observe_keypress_function():
    if key_was_pressed:
        print('Key has been pressed')
        paused = True

while True:
    if paused:
        input('Waiting for input')
    for i in range(1, 10):
        print(i)
        time.sleep(1)

这是我在循环期间给定 keypress 时正在寻找的输出

1
2
3
4  # Between 4 and 5 is a keypress
Key has been pressed
5
6
7
8
9
Waiting for input

显然,这不需要是这样的函数,但我希望这就是发生的情况。

我尝试使用键盘库,但它对我不起作用。我还认为线程可能有用。这样我就可以随时检测到按键,然后等到循环完成即可暂停。然而,我还没有充分尝试过这是否可行(我也没有那么多线程经验)。

非常感谢您的帮助!

python multithreading loops keyboard
1个回答
0
投票

下面是一个非常简单的多线程方法。只需使用一个侦听线程和几个共享事件来暂停和停止整个事情。通过连续 10 秒睡眠来模拟工作时间。输入“q”时停止

import sys
import time
from threading import Thread, Event

pause_event = Event()
stop_event  = Event()

def listener():
    while True:
        s = input()
        pause_event.set()
        if s.lower().startswith('q'):
            stop_event.set()
        if stop_event.is_set():
            break

def main():
    listenthread = Thread(target=listener)
    listenthread.daemon = False
    listenthread.start()
    pause_event.clear()
    stop_event.clear()
    while True:
        if stop_event.is_set():
            break
        if pause_event.is_set():
            pause_event.clear()
            pause_event.wait()
            pause_event.clear()
            continue
        time.sleep(10)
    stop_event.set()
    listenthread.join()

main()
© www.soinside.com 2019 - 2024. All rights reserved.