Tkinter循环密钥绑定不工作

2024-04-23 16:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()函数的event参数-我认为这是一个常见的string,但在网上没有发现这方面或相反的证据。如果我很确定视觉上相似的绑定数量会不断增加,并且我不希望代码中有任何拷贝粘贴,那么我如何保持内容的简洁?你知道吗

upd:发现绑定不应该被视为代码的功能部分,因此不需要美学上的缩短。但是我仍然很好奇为什么这不起作用,以及event参数是由什么组成的。你知道吗


Tags: 对象lambda代码selfrighteventmovebind
1条回答
网友
1楼 · 发布于 2024-04-23 16:55:30

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

此快速解决方案应能解决以下问题:

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

相关问题 更多 >