Tkinter 字符串回调

Posted

技术标签:

【中文标题】Tkinter 字符串回调【英文标题】:Tkinter string callbacks 【发布时间】:2011-07-23 17:08:25 【问题描述】:

情况如下:

我有一个 XML 文件,其中包含我的应用程序的菜单层次结构。我可以显示菜单,但在 XML 文件中定义回调只返回字符串。

更明确的问题: 我需要一种通过字符串回调函数的方法。是的,这里有

lambda x: pass

交易,但我不确定这是否是我需要的。

【问题讨论】:

字符串是什么样的? 好吧,getattr 可能会起作用,但那会有点难看。 它们是回调函数的名称:“self.logic.account_new”就是一个例子。 所以你需要定义如下回调:self.logic.account_new = lambda x: <do sth>? 澄清:您想在 XML/字符串中定义函数,还是想以 XML 命名现有的调用函数,或两者兼而有之? 【参考方案1】:

我需要一种通过字符串回调函数的方法。

从 cmets 到您的问题,我了解到您希望执行以下操作:

# ...
callback_str = getcallback_str() # e.g., 'self.logic.account_new'
callback = eval_dottedname(self, callback_str)`

在这种情况下,eval_dottedname() 函数可以实现为:

def eval_dottedname(obj, dottedname):
    if dottedname.partition(".")[0] != 'self': # or some other criteria
                                               # to limit the context
        raise ValueError
    return reduce(getattr, dottedname.split('.')[1:], obj)

更好的方法是将字符串回调限制为简单的标识符,并使用像 stdlib 的 cmd module 这样的调度表:

  def dispatch(self, callback_str):
      return getattr(self, 'do_' + callback_str, self.default)()      

  def do_this(self):
      pass

  def do_that(self):
      pass

【讨论】:

以上是关于Tkinter 字符串回调的主要内容,如果未能解决你的问题,请参考以下文章

Python - 从Tkinter回调返回

更改 Tkinter 列表框选择时获取回调?

带有可变参数的回调函数 tkinter 按钮

使用 SHAP 的 Tkinter 回调异常

tkinter 按钮回调中的 Lambda 函数

Tkinter 按钮回调缺少它包含的参数[重复]