我正在与 Turtle 合作,重新创建乒乓球游戏,作为入门课程的一部分。 我有 2 个乌龟对象,称为桨,存储在字典中,并带有移动它们的相关键,请参见下文。 我正在尝试使用嵌套 for 循环与 onkeypress() 进行绑定。正如 elsewhere 所建议的,我使用 lambda 函数将方向“way”传递给“move”方法,该方法位于另一个模块的 Paddle 类中。
预期行为:按下向上和向下箭头时右桨移动,按下 w 和 s 时左桨移动。
行为:只有右侧拨片移动,并对所有 4 个键(上、下、w、s)做出响应,但方向正确。
这是for循环
for side in paddles:
for way in paddles[side]["way"]:
screen.onkeypress(lambda way=way, key=key:
paddles[side]["paddle"].move(way), paddles[side]["way"][way]["key"])
对于上下文,这是该词典的摘录。 (确实丑,但我只是在练习。)
PADDLE_KEY_MAP = {
"left":
{
"way":
{
"up":
{
"key": "w",
},
"down":
{
"key": "s",
},
}
"paddle": object
},
"right":
{
"way":
{
"up":
{
"key": "Up",
},
"down":
{
"key": "Down",
},
}
"paddle": object
}
}
如果我在 onkeypress() 中明确仅使用其中一个拨片,则绑定适用于任一侧,并且该侧会发生预期的行为。例如。 w 和 s 正确地移动左桨,而其他键则不能。
但是如果循环中存在两个桨,则它永远不会起作用。当我在 Paddle (
move()
) 的 if self.side == "left"
方法中检查“left”时,该语句永远不会通过。我还尝试在 for 循环中强制使用桨(如果 side == left 则 paddle = left paddle,否则为 right),但这也失败了。
所以我将范围缩小到
onkeypress
语句和/或 lambda 函数。希望这是有道理的。
有什么建议么?预先感谢
您还没有共享一个最小的、完整的示例,但问题是这些循环变量没有绑定到闭包,因此它们将始终具有循环结束时的最后一个值。添加一个函数闭包来持久化循环的每次迭代:
def bind(side, way):
screen.onkeypress(
lambda way=way,
key=key: paddles[side]["paddle"].move(way),
paddles[side]["way"][way]["key"]
)
for side in paddles:
for way in paddles[side]["way"]:
bind(side, way)
请参阅如何在海龟图形中将多个按键绑定在一起?以获取
bind()
函数的完整工作示例。一般来说,对于如此简单的键绑定操作,您不应该需要这么大的嵌套字典。