You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在While循环中实现单次键盘输入检测(无需持续按键)

解决单次按键触发程序控制的问题

我完全懂你的困扰——每次都得按住Alt或Esc才能让程序响应,偶尔还因为按键时机不对没检测到,太影响体验了。问题出在你当前用的keyboard.is_pressed()上:它只能检测代码执行到那一行的瞬间按键是否被按住,而不是捕捉「按键被按下一次」这个事件,所以必须持续按住才能让循环扫到。

解决方案:改用按键事件监听

我们可以用keyboard库的事件回调机制,注册按键按下的触发函数,这样按一次键就会立即执行对应的操作,不需要持续按住。下面是修改后的完整代码,我保留了你原来的业务逻辑,只调整了按键控制部分:

import keyboard
import time
# 假设你的browser已经初始化(比如Selenium WebDriver)
# from selenium import webdriver
# browser = webdriver.Chrome()

def clear_console():
    # 实现你的清屏逻辑,比如:
    # import os
    # os.system('cls' if os.name == 'nt' else 'clear')
    pass

# 全局状态变量,控制程序运行
prg_status = False
is_paused = False

def on_ctrl_press(event):
    """按下Ctrl启动程序"""
    global prg_status
    if not prg_status:
        prg_status = True
        print("program started...")

def on_esc_press(event):
    """按下Esc终止程序"""
    global prg_status
    if prg_status:
        prg_status = False
        print('program terminated')

def on_alt_press(event):
    """按下Alt暂停/恢复程序"""
    global is_paused
    if prg_status:
        is_paused = not is_paused
        if is_paused:
            print('program paused')
        else:
            print('program resumed')

# 注册按键事件,trigger_on_release=True避免按住时重复触发
keyboard.on_press_key('ctrl', on_ctrl_press, trigger_on_release=True)
keyboard.on_press_key('esc', on_esc_press, trigger_on_release=True)
keyboard.on_press_key('alt', on_alt_press, trigger_on_release=True)

# 主循环
while True:
    if prg_status and not is_paused:
        try:
            try:
                # 尝试获取结果文本
                results = browser.find_element_by_xpath("//div[@class='summary-text summary-text__expanded']").text
            except:
                # 找不到元素时给默认值,避免后续报错
                results = "0 results matching"
            
            num_rslt1 = int(results[0])
            if num_rslt1 > 0:
                clear_console()
                print(f"{results[:2]} load(s) found")
                # playsound('audio.mp3')
            
            # 点击刷新按钮
            browser.find_element_by_class_name("reload-icon").click()
            time.sleep(3)
        except Exception as e:
            # 打印错误方便调试,不要直接pass
            print(f"Runtime error: {str(e)}")
            time.sleep(3)
    else:
        # 程序未启动或暂停时,休眠减少CPU占用
        time.sleep(0.1)

关键修改点说明:

  1. 事件回调替代轮询检测:用keyboard.on_press_key()注册每个按键的处理函数,按下一次就触发,不需要持续按住。trigger_on_release=True确保松开按键时才执行,避免按住期间重复触发。
  2. 状态变量控制循环:用prg_status控制程序是否运行,is_paused控制是否暂停,回调函数只修改这些状态,主循环根据状态决定是否执行业务逻辑。
  3. 容错处理优化:给results加了默认值,避免找不到元素时后续int(results[0])报错;把空的except改成捕获具体异常并打印,方便调试。
  4. 减少资源占用:程序未运行或暂停时,主循环会休眠0.1秒,避免一直占用CPU。

额外提示:

  • 运行键盘监听程序通常需要管理员权限,如果报错可以尝试用管理员身份启动脚本。
  • 如果你还是想用原来的轮询方式(不想用事件回调),可以改用keyboard.read_key()或者keyboard.wait(),但事件回调的方式更高效稳定。

内容的提问来源于stack exchange,提问作者WeeeHaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:25:20