【问题标题】:Tkinter bindings : how to understand the scope in a for loop? [duplicate]Tkinter 绑定:如何理解 for 循环中的范围? [复制]
【发布时间】:2018-08-10 10:57:57
【问题描述】:

看来这个问题已经在这里问过了:

但我不明白答案。 这是同一问题的另一个代码示例:

如何理解 for 循环中的作用域?

[edit]我的'orient'函数是这样定义的:[/edit]

orient = lambda snake, direction: snake.changeDirection(direction)

我尝试用这个循环分配 tkinter 绑定:

for player in Parameters.players:
    snake = self.snakes[player]
    self.root.bind(bindings[player]['up'], lambda event : orient(snake, Direction.N))
    self.root.bind(bindings[player]['left'], lambda event : orient(snake, Direction.W))
    self.root.bind(bindings[player]['down'], lambda event : orient(snake, Direction.S))
    self.root.bind(bindings[player]['right'], lambda event : orient(snake, Direction.E))

但是这两个绑定被分配给了最后一条蛇

所以我尝试“手动”循环:

player1 = Parameters.players[0]
snake1 = self.snakes[player1]
self.root.bind(bindings[player1]['up'], lambda event : orient(snake1, Direction.N))
self.root.bind(bindings[player1]['left'], lambda event : orient(snake1, Direction.W))
self.root.bind(bindings[player1]['down'], lambda event : orient(snake1, Direction.S))
self.root.bind(bindings[player1]['right'], lambda event : orient(snake1, Direction.E))

player2 = Parameters.players[1]
snake2 = self.snakes[player2]
self.root.bind(bindings[player2]['up'], lambda event : orient(snake2, Direction.N))
self.root.bind(bindings[player2]['left'], lambda event : orient(snake2, Direction.W))
self.root.bind(bindings[player2]['down'], lambda event : orient(snake2, Direction.S))
self.root.bind(bindings[player2]['right'], lambda event : orient(snake2, Direction.E))

它起作用了(每条蛇都有自己的束缚)

lambda 函数实际上是如何创建的?为什么它会“捕获”变量并因此被覆盖而不是保留其值?

【问题讨论】:

标签: python python-3.x tkinter key-bindings


【解决方案1】:

最终代码为:

orient = lambda snake, direction: snake.changeDirection(direction)
for player in Parameters.players:
    snake = self.snakes[player]
    self.root.bind(bindings[player]['up'], lambda event, snake=snake : orient(snake, Direction.N))
    self.root.bind(bindings[player]['left'], lambda event, snake=snake : orient(snake, Direction.W))
    self.root.bind(bindings[player]['down'], lambda event, snake=snake : orient(snake, Direction.S))
    self.root.bind(bindings[player]['right'], lambda event, snake=snake : orient(snake, Direction.E))

注意 lambda 定义中的“snake=snake”。

此处解释:Creating functions in a loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多