如何在Python curses中检测CTRL+按键等快捷键组合?
Python curses检测快捷键组合的方法
一、CTRL组合键的检测
Python curses里有两种方式检测CTRL+字母的组合:
- 使用预定义常量:curses库内置了
curses.KEY_CTRL_*系列常量,比如curses.KEY_CTRL_A对应CTRL+A,curses.KEY_CTRL_S对应CTRL+S,直接判断即可。 - 手动计算ASCII值:CTRL+大写字母的ASCII值等于该字母的
ord()值减去64,比如:- CTRL-A:
ord('A') - 64 = 1 - CTRL-S:
ord('S') - 64 = 19
- CTRL-A:
二、ALT组合键的检测
ALT+字符的组合在curses中通常被编码为「字符ASCII值 + 256」,可以通过两种方式判断:
- 使用
curses.is_alt_key(key)函数直接判断是否按下ALT键,再提取对应字符:if curses.is_alt_key(key): char = chr(key & 0xFF) if char.lower() == 'x': # 检测到ALT-X pass - 直接判断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
相关产品推荐
相关产品推荐

