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

如何用Python keyboard包抑制RPi相机脚本中的按键输出

解决RPi相机脚本中按键回显问题

问题核心:使用keyboard.is_pressed()检测按键时,'p'和'q'的字符会被终端回显,导致输出混乱(如pPicture taken and saved),需要抑制这些按键的终端输出,同时保留拍照和退出功能。

原因分析

keyboard.is_pressed()仅检测按键状态,不会拦截或消费按键事件,因此终端仍会接收并显示按下的字符,干扰正常输出。

解决方案

利用keyboard库的按键拦截功能,通过以下两种方式实现抑制回显:

方案1:按键回调(推荐,非阻塞)

通过keyboard.on_press_key()注册按键回调函数,设置suppress=True阻止按键事件传递到终端:

from picamera2 import Picamera2, Preview
import keyboard
import sys

cam = Picamera2()
cam.start_preview(Preview.QTGL)
cam.start()

savepath = '/home/pk/camera/image/'
imgname = "picture"

def take_photo(e):
    request = cam.capture_request()
    request.save("main", savepath + imgname, format="png")
    print("Picture taken and saved")

def exit_program(e):
    print("Closing camera...")
    cam.stop_preview()
    cam.stop()
    cam.close()
    sys.exit()

# 注册按键并抑制回显
keyboard.on_press_key("p", take_photo, suppress=True)
keyboard.on_press_key("q", exit_program, suppress=True)

# 保持程序运行
keyboard.wait()

方案2:阻塞式按键读取

使用keyboard.read_key(suppress=True)读取按键并直接抑制回显:

from picamera2 import Picamera2, Preview
import keyboard

cam = Picamera2()
cam.start_preview(Preview.QTGL)
cam.start()

savepath = '/home/pk/camera/image/'
imgname = "picture"

try:
    while True:
        # 读取按键并抑制回显
        key = keyboard.read_key(suppress=True)
        if key == "p":
            request = cam.capture_request()
            request.save("main", savepath + imgname, format="png")
            print("Picture taken and saved")
        elif key == "q":
            print("Closing camera...")
            break
finally:
    cam.stop_preview()
    cam.stop()
    cam.close()

效果说明

两种方案都能避免终端回显'p'和'q'字符,输出将仅显示设定的提示内容:

Picture taken and saved
Closing camera...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:23:17