Python游戏开发:定时器调用函数及keyboard模块报错问题求助
解决游戏开发中的键盘模块报错与定时器调用问题
一、搞定ModuleNotFoundError: keyboard错误
首先分两种环境处理:
- 本地Python环境:先确认
keyboard模块未安装导致报错,打开终端执行:
Windows用户需以管理员身份运行终端;Linux/macOS需加pip install keyboardsudo:
若仍报错,检查Python版本,用sudo pip install keyboardpip3代替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作为参数传递,直接在函数内使用全局导入的模块更简洁。
三、代码其他问题修正
- 变量作用域问题:
dx在函数内未初始化,character、dy若为全局变量,必须加global声明,否则会报未定义错误。 - 按键读取逻辑问题:多次调用
keyboard.read_key()会导致每次判断都读取一次按键,逻辑混乱,改用keyboard.is_pressed()检测按键状态更可靠。 - 定时器间隔问题: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
相关产品推荐
相关产品推荐

