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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:54:04