Tkinter循环键绑定不起作用

时间:2014-06-12 07:32:50

标签: python for-loop binding tkinter

我制作了一段代码,旨在支持画布上对象的键控移动:

self.can = tk.Canvas(master, width=100, height=100)
self.can.grid()

self.can.bind('<Right>', lambda event: self.move(0))
self.can.bind('<Down>', lambda event: self.move(90))
self.can.bind('<Left>', lambda event: self.move(180))
self.can.bind('<Up>', lambda event: self.move(270))

self.can.focus_set()

def move(self, dir):
    if dir == 0:
        print 'right'
    elif dir == 90:
        print 'down'
    elif dir == 180:
        print 'left'
    elif dir == 270:
        print 'up'

我还没有对象,所以我只测试了键绑定。没关系。但后来我尝试优化内容并将这些绑定放在循环中

x = 0
for i in ['<Right>', '<Down>', '<Left>', '<Up>']:
    self.can.bind(i, lambda event: self.move(x))
    x += 90

......它停止了工作。没有错误,但也没有约束力。也许这完全是关于event函数的.bind()参数 - 我认为这是一个常见的string,但在网络上没有发现这个或相反的证据。如果我非常确定视觉上类似的绑定量会继续增长并且我不想在我的代码中进行任何复制粘贴,那么如何保持简洁和简洁呢?

upd:发现不应将绑定视为代码的功能部分,因此不需要美学缩短。但是我仍然很好奇为什么没有这个工作以及event论证包含的内容。

1 个答案:

答案 0 :(得分:0)

这是因为对于所有绑定,x将等于360.Lambda将在执行时获取当前x值。当它发生时x = 360.

这个快速修复,应解决问题:

self.can.bind(i, lambda event, xx=x: self.move(xx))