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