Python使用turtle库时如何为onkeypress绑定的带参函数传递参数?
turtle库onkeypress绑定带参函数的实现方法
问题根源
turtle.Screen.onkeypress() 方法要求传入的第一个参数是无参数的函数引用,你现有代码中直接写move_paddle_up(left_pad)会在代码执行到绑定逻辑时立刻调用该函数,返回值为None,相当于你给按键绑定了一个空值,按下按键自然没有任何反应。
可行的实现方案
你可以保留现有两个带参移动函数的定义,通过以下两种方式完成绑定:
方案1:使用lambda匿名函数封装(最简便)
lambda会生成一个临时的无参函数,只有按键触发时才会执行内部的带参移动逻辑,修改绑定部分的代码即可:
def move_paddle_up(paddle): y = paddle.ycor() y += 20 paddle.sety(y) def move_paddle_down(paddle): y = paddle.ycor() y -= 20 paddle.sety(y) # 键盘按键绑定 screen.listen() screen.onkeypress(lambda: move_paddle_up(left_pad), "w") screen.onkeypress(lambda: move_paddle_down(left_pad), "s") screen.onkeypress(lambda: move_paddle_up(right_pad), "Up") screen.onkeypress(lambda: move_paddle_down(right_pad), "Down")
方案2:使用functools.partial预绑定参数
如果需要复用绑定后的函数,可以用标准库的functools.partial把参数提前绑定到原函数上,生成新的无参函数:
import functools def move_paddle_up(paddle): y = paddle.ycor() y += 20 paddle.sety(y) def move_paddle_down(paddle): y = paddle.ycor() y -= 20 paddle.sety(y) # 预生成绑定了对应 paddle 的无参函数 move_left_up = functools.partial(move_paddle_up, left_pad) move_left_down = functools.partial(move_paddle_down, left_pad) move_right_up = functools.partial(move_paddle_up, right_pad) move_right_down = functools.partial(move_paddle_down, right_pad) # 绑定按键 screen.listen() screen.onkeypress(move_left_up, "w") screen.onkeypress(move_left_down, "s") screen.onkeypress(move_right_up, "Up") screen.onkeypress(move_right_down, "Down")
两种方案都满足onkeypress对无参回调函数的要求,实际使用中优先选择lambda方案即可,代码更简洁不需要额外导入依赖。
内容的提问来源于stack exchange,提问作者m3.b
相关产品推荐
相关产品推荐

