【问题标题】:How to have an infinite keybind in python 3 Tkinter如何在 python 3 Tkinter 中拥有无限键绑定
【发布时间】:2016-10-29 01:03:47
【问题描述】:
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。我怎样才能使这项工作?我尝试过使用线程,但它们是无限的,而且因为它们共享文本对象的资源(我认为),它们必须使用锁,我不知道该怎么做。如果有人能解释如何使用锁、线程或任何非常有用的东西。谢谢!还有两件事:请不要建议更改系统递归深度,如果答案是程序性的而不是严重面向对象的,我更愿意。不过也没关系。再次,提前致谢。

【问题讨论】:

  • 绑定期望函数名 - 这意味着没有 () 和参数。现在 Python 在开始时运行 gate() 以将结果绑定到 &lt;Return&gt; 但在 gate() 内部是另一个 gate() 所以你得到递归。你为什么在gate()里面使用gate()???
  • @furas 让它永远运行
  • 它将永远运行(或直到maximum recursion depth exceeded),但我不知道你为什么需要这种结构。
  • 您只能绑定一次&lt;return&gt;,它将永远有效。所以你不需要在gate() 内使用bind,但你需要`lambda 来分配带有参数的函数。但我认为你可以在没有争论的情况下做到这一点。

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


【解决方案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)

由于您在函数内部执行此操作,因此当调用该函数时,它会立即再次调用自己,而后者又会立即再次调用自己,这就是您得到递归错误的原因。

您必须将 callable 传递给 bind 方法。除非您需要传递参数,否则最好避免 lambda 始终对函数进行绑定调用。正确绑定事件后,只需设置一次绑定即可在程序的整个生命周期内工作。

例如:

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

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

【讨论】:

  • event 参数是什么? (新的:)
【解决方案2】:

至于我你需要

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)

【讨论】:

  • 您的代码不起作用。 gate在事件触发时会被赋予一个事件对象作为参数。
  • @BryanOakley 是的,我忘了事件 :)
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多