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

如何在Python curses中检测CTRL+按键等快捷键组合?

Python curses检测快捷键组合的方法

一、CTRL组合键的检测

Python curses里有两种方式检测CTRL+字母的组合:

  1. 使用预定义常量:curses库内置了curses.KEY_CTRL_*系列常量,比如curses.KEY_CTRL_A对应CTRL+A,curses.KEY_CTRL_S对应CTRL+S,直接判断即可。
  2. 手动计算ASCII值:CTRL+大写字母的ASCII值等于该字母的ord()值减去64,比如:
    • CTRL-A:ord('A') - 64 = 1
    • CTRL-S:ord('S') - 64 = 19

二、ALT组合键的检测

ALT+字符的组合在curses中通常被编码为「字符ASCII值 + 256」,可以通过两种方式判断:

  1. 使用curses.is_alt_key(key)函数直接判断是否按下ALT键,再提取对应字符:
    if curses.is_alt_key(key):
        char = chr(key & 0xFF)
        if char.lower() == 'x':
            # 检测到ALT-X
            pass
    
  2. 直接判断key值是否大于256,再减去256得到原字符:
    if key > 256:
        char = chr(key - 256)
        if char.lower() == 'x':
            # 检测到ALT-X
            pass
    

三、macOS下CMD+A的检测

注意:默认macOS终端会拦截CMD组合键(比如CMD+A被系统用作全选),需先在终端设置中开启允许传递CMD键(不同终端设置路径不同,比如Terminal.app可在「偏好设置-描述文件-键盘」中勾选「将Option键用作Meta键」或调整快捷键映射)。

在curses中,CMD键按下时会在key值的高位标记meta位,可通过位运算判断:

# 检测CMD+A
if (key & 0x1000) != 0 and chr(key & 0xFF) == 'A':
    # 检测到CMD+A
    pass

完整示例代码

import curses

def main(stdscr):
    curses.curs_set(0)
    stdscr.clear()
    stdscr.addstr(0, 0, "Press CTRL-A/CTRL-S/ALT-X/CMD+A (macOS) to test, press q to quit")
    stdscr.refresh()

    while True:
        key = stdscr.getch()
        
        if key == ord('q'):
            break
        
        # 检测CTRL组合键
        if key == curses.KEY_CTRL_A:
            stdscr.addstr(2, 0, "Detected CTRL-A                ")
        elif key == curses.KEY_CTRL_S:
            stdscr.addstr(2, 0, "Detected CTRL-S                ")
        
        # 检测ALT-X
        elif curses.is_alt_key(key):
            char = chr(key & 0xFF)
            if char.lower() == 'x':
                stdscr.addstr(2, 0, "Detected ALT-X                 ")
        
        # 检测macOS CMD+A
        elif (key & 0x1000) != 0 and chr(key & 0xFF) == 'A':
            stdscr.addstr(2, 0, "Detected CMD+A (macOS)         ")
        
        stdscr.refresh()

if __name__ == "__main__":
    curses.wrapper(main)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:25:10