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

如何在Python中使用sshkeyboard捕获按键并拼接为6位ID变量

解决sshkeyboard捕获6位按键输入的问题

原代码的核心问题

  • 作用域错误:key变量仅在press函数内部有效,外部代码直接调用key会触发未定义错误。
  • 阻塞逻辑失效:listen_keyboard是阻塞式调用,启动后会持续监听按键,根本不会回到外层的while循环,循环逻辑完全无效。
  • 无停止机制:即使收集到6位字符,监听会一直运行,无法自动终止。

修正后的代码(基础版)

#!/usr/bin/python3
from sshkeyboard import listen_keyboard

inputID = ""

def press(key):
    global inputID
    # 仅接受数字按键(如果需要限制输入为纯数字ID)
    if key.isdigit():
        inputID += key
        print(f"当前输入: {inputID}")
        # 输入长度达到6时,返回False终止监听
        if len(inputID) == 6:
            return False

# 启动按键监听,suppress=True可避免按键在终端重复显示
listen_keyboard(on_press=press, suppress=True)

print('最终输入的ID是:', inputID)

关键修改说明

  1. 作用域处理:用global关键字让press函数可以直接修改全局变量inputID,解决按键值无法传递到外部的问题。
  2. 终止监听逻辑:当inputID长度达到6时,press函数返回False,触发listen_keyboard自动停止监听。
  3. 移除无效循环:直接依靠listen_keyboard的阻塞特性处理按键事件,不需要外层while循环。
  4. 输入过滤:增加isdigit()判断,确保只有数字按键被加入ID(如果需要支持其他字符,可去掉此判断)。

进阶版(支持退格键修正输入)

如果需要允许用户用退格键删除输入的字符,可以添加如下逻辑:

#!/usr/bin/python3
from sshkeyboard import listen_keyboard

inputID = ""

def press(key):
    global inputID
    if key.isdigit() and len(inputID) < 6:
        inputID += key
        print(f"当前输入: {inputID}")
    elif key == "backspace" and len(inputID) > 0:
        inputID = inputID[:-1]
        print(f"当前输入: {inputID}")
    # 输入长度达标后终止监听
    if len(inputID) == 6:
        return False

listen_keyboard(on_press=press, suppress=True)

print('最终输入的ID是:', inputID)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:22:33