如何使用onkeypress实现Python不同类之间的参数传递
问题原因
- 第一种写法的问题:
functools.partial在事件绑定执行时就立刻调用了ship.get_pos(),拿到的是程序启动时飞船的初始x坐标0,后续无论飞船如何移动,传入shoot_now的都是初始计算好的固定值,因此输出始终为0。 - 第二种写法的问题:直接传入了
ship.get_pos方法本身而非方法执行后的返回值,因此shoot_now接收到的是方法对象,不是坐标数值。 - 隐藏逻辑缺陷:你当前的
get_pos方法返回的是__init__中一次性赋值的self.x,后续飞船移动时这个静态值不会自动更新,即使正常调用get_pos也无法拿到实时位置。
修复方案
1. 修正Ship类的坐标获取逻辑
修改ship.py中的get_pos方法,每次调用时直接获取飞船的实时坐标,无需提前存储静态值:
def __init__(self): super().__init__() self.ship = Turtle(shape='turtle') self.ship.penup() self.ship.color('white') self.ship.goto(0, -250) self.ship.left(90) def get_pos(self): # 每次调用都返回当前最新的x坐标 return self.ship.xcor()
2. 修改按键事件绑定逻辑
使用lambda匿名函数包装调用逻辑,保证每次按下空格时才实时获取飞船坐标并传入射击函数:
screen.onkeypress(lambda: shots.shoot_now(ship.get_pos()), 'space')
原理:lambda是可调用对象,注册事件时仅保存函数引用不会立刻执行,只有按键触发时才会执行内部逻辑,获取最新坐标传给shoot_now。
内容的提问来源于stack exchange,提问作者Matheus Costa
相关产品推荐
相关产品推荐

