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

Python游戏开发:定时器调用函数及keyboard模块报错问题求助

解决游戏开发中的键盘模块报错与定时器调用问题

一、搞定ModuleNotFoundError: keyboard错误

首先分两种环境处理:

  • 本地Python环境:先确认keyboard模块未安装导致报错,打开终端执行:
    pip install keyboard
    
    Windows用户需以管理员身份运行终端;Linux/macOS需加sudo:
    sudo pip install keyboard
    
    若仍报错,检查Python版本,用pip3代替pip适配Python3环境。
  • 浏览器端Python(Brython):你代码里导入了from browser import timer,大概率是这种环境——keyboard是本地Python专用库,浏览器端不支持,必须改用原生键盘事件监听,这才是报错的核心原因。

二、定时器调用带参数函数的正确姿势

你代码里timer.set_interval(set_horizontal_movement(), 1)犯了关键错误:直接传入了函数执行结果,而非函数对象。带参数调用有两种写法:

方法1:用lambda表达式包裹

timer.set_interval(lambda: set_horizontal_movement(你的参数), 间隔时间)

方法2:用functools.partial

先导入工具类:

from functools import partial
timer.set_interval(partial(set_horizontal_movement, 你的参数), 间隔时间)

不过看你的逻辑,其实没必要把keyboard作为参数传递,直接在函数内使用全局导入的模块更简洁。

三、代码其他问题修正

  1. 变量作用域问题:dx在函数内未初始化,character、dy若为全局变量,必须加global声明,否则会报未定义错误。
  2. 按键读取逻辑问题:多次调用keyboard.read_key()会导致每次判断都读取一次按键,逻辑混乱,改用keyboard.is_pressed()检测按键状态更可靠。
  3. 定时器间隔问题:1毫秒间隔过于密集,会占用大量CPU资源,建议设为16毫秒(对应60帧刷新率)。

本地Python环境修正后的代码

from browser import timer
import keyboard

# 全局变量定义
dx = 0
dy = 0
character = 你的玩家模型实例  # 替换为实际的玩家模型对象

def set_horizontal_movement():
    global dx
    dx = 0
    if keyboard.is_pressed("ArrowRight") or keyboard.is_pressed("d"):
        dx = 2
    elif keyboard.is_pressed("ArrowLeft") or keyboard.is_pressed("a"):
        dx = -2
    character.move(dx, dy)

# 传递函数对象(不要加括号),间隔设为16毫秒
timer.set_interval(set_horizontal_movement, 16)

Brython(浏览器端)环境修正后的代码

浏览器端无法使用keyboard模块,改用原生事件监听:

from browser import document, timer

dx = 0
dy = 0
character = 你的玩家模型实例  # 替换为实际的玩家模型对象

def keydown(event):
    global dx
    if event.key in ("ArrowRight", "d"):
        dx = 2
    elif event.key in ("ArrowLeft", "a"):
        dx = -2

def keyup(event):
    global dx
    if event.key in ("ArrowRight", "d", "ArrowLeft", "a"):
        dx = 0

# 绑定键盘按下/松开事件
document.bind("keydown", keydown)
document.bind("keyup", keyup)

def update_movement():
    character.move(dx, dy)

timer.set_interval(update_movement, 16)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:52:20