将 Turtle 动态传递给 onkeypress() 始终只绑定其中一个

问题描述 投票:0回答:1

我正在与 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 函数。希望这是有道理的。 有什么建议么?预先感谢

python turtle-graphics python-turtle onkeypress
1个回答
0
投票

您还没有共享一个最小的、完整的示例,但问题是这些循环变量没有绑定到闭包,因此它们将始终具有循环结束时的最后一个值。添加一个函数闭包来持久化循环的每次迭代:

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()
函数的完整工作示例。一般来说,对于如此简单的键绑定操作,您不应该需要这么大的嵌套字典。

© www.soinside.com 2019 - 2024. All rights reserved.