【问题标题】:Variable in bind in tkinter python moduletkinter python模块中的绑定变量
【发布时间】:2021-12-28 17:05:38
【问题描述】:

我想知道是否有任何方法可以绕过在 tkinter 中的绑定中使用的回调函数中使用全局变量。

我指的是:

canvas = Canvas(root, width=500, height=500)
canvas.bind('<B1-Motion>', func)

func 现在是一些在拖动鼠标时触发的函数。我想要的是这样的:

canvas.bind('<B1-Motion>', func(arg))

结合:

def func(event, arg):
    commands

我可以从https://docs.python.org/3/library/tkinter.html 看到一个参数,即事件本身,被赋予了回调函数,但不给这个方法以任何方式以不同的方式修改其回调似乎是浪费潜力。

也许我弄错了,一般来说这是不可能的,或者有其他方法可以替代绑定。

我基本上期待的是:

buttoname = Button(...,...,..., command =  Lambda: func(arg))

如果有人有任何指点,将不胜感激。

问候

【问题讨论】:

  • lambda e: func(e, arg)
  • 太棒了!它有效,但为什么呢?
  • 为什么它不能工作?这就是 lambda 的工作原理。
  • 看,这就是答案

标签: python tkinter bind eventhandler


【解决方案1】:

使用lambda 接收事件参数并将其传递。

canvas.bind('<B1-Motion>', lambda e: func(e, arg))

【讨论】:

  • 我不明白的是,这看起来像在这一行中使用参数 arg 评估函数。但是使用它会导致函数被使用 arg 和任何必须提供的事件进行评估,比如在这种情况下 x 和 y。该函数是否被调用了两次? lambda 实际上是一个包装器吗?
  • @JannisErhard:请参阅 stackoverflow.com/a/59687539/7432 了解 lambda 工作原理的简要说明。
  • lambda 的全部意义在于它只是定义了一个匿名函数,而不是调用它。事件发生时调用该函数。 @JannisErhard
  • @JannisErhard for a more detailed answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2011-06-25
  • 2015-12-28
  • 1970-01-01
  • 2021-11-11
  • 2013-03-30
相关资源
最近更新 更多