[Python/Tkinter]如何获取在函数"event_generate"中设置的数据值



我正在使用Python 2.7.4和Tkinter的新版本,并且我被下面的代码所困扰。我生成了一个事件"test",并使用字符串设置了"data"选项,但是在从事件中检索它时发生了错误。

Error -> AttributeError:事件实例没有属性'data'

from Tkinter import *
def handle_it(event):
    # print "event handler"
    print event.data
root = Tk()
root.after(1, lambda: root.event_generate('<<test>>', data="hi there"))
root.bind('<<test>>', handle_it)
root.mainloop()

我找不到这种情况的相关Python文档,所以我参考了下面的tcl文档http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm M14

Python 2.7的TKinter支持"data"选项吗?谢谢!

不,不幸的是它没有。Tcl解释器将其识别为有效选项,但它是Event类中未包含的缺失选项之一,如warp。您可以查看Tkinter源代码的第1188行,以查看其余缺少的选项。

Tkinter没有正确处理event_generate的data字段。

下面是一个使用Tkinter的私有API(实际上是Tcl…)的代码片段,它允许读取这个字段。这个函数只对字面量起作用,我通常给数据传递一个带有字面量的字典。

from Tkinter import *
def handle_it(event):
    # print "event handler"
    print event.data
def bind_event_data(widget, sequence, func, add = None):
    def _substitute(*args):
        e = lambda: None #simplest object with __dict__
        e.data = eval(args[0])
        e.widget = widget
        return (e,)
    funcid = widget._register(func, _substitute, needcleanup=1)
    cmd = '{0}if {{"[{1} %d]" == "break"}} breakn'.format('+' if add else '', funcid)
    widget.tk.call('bind', widget._w, sequence, cmd)
root = Tk()
# unfortunately, does not work with my snippet (the data argument is eval-ed)
# you can adapt it to handle raw string.
root.after(100, lambda : root.event_generate('<<test>>', data="hi there"))
# works, but definitely looks too hacky
root.after(100, lambda : root.event_generate('<<test>>', data="'hi there'"))
# the way I typically use it
root.after(100, lambda : root.event_generate('<<test>>', data={"content": "hi there"}))
#should be:
#  root.bind('<<test>>', handle_it)
bind_event_data (root, '<<test>>', handle_it)
root.mainloop()

相关内容

  • 没有找到相关文章

最新更新