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 字符串回调的主要内容,如果未能解决你的问题,请参考以下文章