Tkinter绑定:如何理解for循环的作用域?

时间:2018-08-10 10:57:58

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

似乎问题已经在这里提出了:

但是我不明白答案。 这是相同问题的其他代码示例:

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

[edit]我的“东方”功能的定义如下:[/ edit]

Utils.splitOption(tmpStr)

我尝试通过此循环分配tkinter绑定:

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

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

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

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))

它奏效了(每条蛇都有他的绑定)

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

1 个答案:

答案 0 :(得分:0)

最终代码是:

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