如何在python 3 Tkinter中拥有一个无限的键绑定

时间:2016-10-29 01:03:47

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

def gate(i):
input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend')))
inputDatabase.run(i)

input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend')))

input是一个tkinter文本对象。

我正在创建一个控制台,因此当用户按下返回键时,它会获取文本对象中的最后一行。这需要永远发生。

给予RecursionError: maximum recursion depth exceeded。我怎样才能做到这一点?我尝试过使用线程,但它们是无限的,因为它们共享文本对象的资源(我认为),它们必须使用锁,我无法弄清楚如何做到这一点。如果有人可以解释如何使用锁,线程或任何类型的非常有用的东西。谢谢!还有两件事:请不要建议改变系统的递归深度,如果答案是在程序上而不是在面向对象的情况下,我更愿意。但这并不重要。再次,先谢谢。

2 个答案:

答案 0 :(得分:1)

问题是你没有正确地进行绑定。在你的绑定语句中,你立即调用该函数,然后在函数内部执行相同的操作。

换句话说,这个:

input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend')))

与此完全相同:

value = input.get('end-1c linestart', 'end-1c lineend')
input.bind('<Return>', value)

由于您在函数内部执行此操作,因此在调用该函数时,它会立即再次调用自身,并立即再次调用自身,这就是您收到递归错误的原因。

您必须将可调用传递给bind方法。最好的做法是避免lambda总是有一个绑定调用函数,除非你需要传递参数。正确绑定事件时,只需设置一次绑定即可在程序生命周期内使用。

例如:

def gate(event):
    i = input.get('end-1c linestart', 'end-1c lineend')
    inputDatabase.run(i)

input.bind('<Return>', gate)

答案 1 :(得分:0)

至于我,你需要

def gate(event):
    i = input.get('end-1c linestart', 'end-1c lineend')
    inputDatabase.run(i)

# ---

input.bind('<Return>', gate)

编辑:我在之前的代码中忘记了event(现在已添加)。

Tkinter使用参数执行带绑定的gate,这使您可以访问小部件,因此您可以使用它而不是input

def gate(event):
    i = event.widget.get('end-1c linestart', 'end-1c lineend')
    inputDatabase.run(i)

# ---

input.bind('<Return>', gate)