Python Tkinter循环密钥绑定不工作
我制作了一段代码,旨在支持画布上对象的按键控制移动:Python Tkinter循环密钥绑定不工作,python,for-loop,binding,tkinter,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
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
。。。它停止工作了。没有错误,但也没有绑定。也许这都是关于.bind函数的事件参数——我认为这是一个常见的字符串,但在web上没有发现这方面或相反的证据。如果我非常确定视觉上相似的绑定数量将继续增长,并且我不希望代码中有任何复制粘贴,那么如何保持内容简洁
upd:发现绑定不应该被视为代码的功能部分,因此不需要美学上的缩短。但是我仍然很好奇为什么这不起作用,以及事件参数由什么组成。这是因为对于所有绑定,x将等于360。Lambda将在执行时获取当前的x值。发生时x=360 此快速解决方案应能解决以下问题:
self.can.bind(i, lambda event, xx=x: self.move(xx))
为什么要把它们放在一个循环中?结果不太清楚,容易出现常见错误,例如您正在经历的错误,并且使用相同数量的代码行。在循环中这样做没有任何好处。谢谢,这可能对我有用。但是布莱恩是对的,缩短这个时间真的没有必要。