Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter循环密钥绑定不工作_Python_For Loop_Binding_Tkinter - Fatal编程技术网

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

为什么要把它们放在一个循环中?结果不太清楚,容易出现常见错误,例如您正在经历的错误,并且使用相同数量的代码行。在循环中这样做没有任何好处。谢谢,这可能对我有用。但是布莱恩是对的,缩短这个时间真的没有必要。