如何在Python中不使用chr()将Pygame按键码转换为ASCII字符?
解决Pygame按键码转ASCII字符时的范围错误问题
问题场景
你编写的Pygame键盘输入程序中,尝试用chr()将按键码转换为ASCII字符,但部分功能键(比如Caps Lock)的按键码超出chr()的处理范围,会抛出以下错误:
ValueError: chr() arg not in range(0x110000)
原代码如下:
key = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: for key in keys: if event.key == key: key = key if key != None: print(key) print(chr(key)) return chr(key) else: return
可行解决方案
方法一:提前判断按键码范围
先检查按键码是否在chr()的有效区间(0 ≤ key ≤ 0x10FFFF),不在范围内则返回占位符或跳过:
key = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: for key in keys: if event.key == key: current_key = event.key if 0 <= current_key <= 0x10FFFF: char = chr(current_key) print(current_key, char) return char else: print(f"按键 {current_key} 无法转换为ASCII字符") return None
方法二:用try-except捕获异常
直接尝试转换,捕获ValueError并处理异常情况:
key = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: for key in keys: if event.key == key: current_key = event.key try: char = chr(current_key) print(current_key, char) return char except ValueError: print(f"按键 {current_key} 无法转换为ASCII字符") return None
方法三:结合Pygame按键名称函数
对于功能键,用pygame.key.name()获取按键名称,可打印字符则用chr()转换,兼顾两种场景:
key = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: for key in keys: if event.key == key: current_key = event.key try: char = chr(current_key) print(current_key, char) return char except ValueError: key_name = pygame.key.name(current_key) print(current_key, key_name) return key_name
内容的提问来源于stack exchange,提问作者Hudson Rocke
相关产品推荐
相关产品推荐

