如何在python中触发和侦听事件?
我需要一个实际的例子..
感谢
更新
#add Isosurface button
def addIso():
#trigger event
self.addButton = tk.Button(self.leftFrame, text="Add", command=addIso) #.grid(column=3, row=1)
self.addButton.pack(in_=self.leftFrame, side="right", pady=2)
答案 0 :(得分:1)
根据您对某些现有答案的评论,我认为您想要的是pubsub模块。在Tkinter的上下文中,事件是单一目的 - 一个事件在一个窗口小部件上触发,一些处理程序处理事件(尽管可能涉及多个处理程序)。
你想要的更多是一个广播模型 - 你的小部件说“嘿,用户做了一些事情”,任何其他模块都可以注册兴趣并获得通知,而不知道具体是什么小部件或低级事件导致发生。
我在支持插件的应用中使用它。插件可以说“当用户打开新文件时调用我的'打开'方法”。他们不关心用户是如何做到的(即:它是来自“文件”菜单,还是工具栏图标或快捷方式),只是它发生了。
在这种情况下,您可以将按钮配置为调用特定方法,通常在创建按钮的同一模块中。然后,该方法将使用pubsub模块发布一些其他模块侦听和响应的通用事件。
答案 1 :(得分:0)
TKinter对象有一个绑定函数,它有两个参数:第一个是表示你想要监听的事件名称的字符串(在这种情况下可能是“”),第二个是触发的方法event作为参数。
示例:
def addButton_click(event):
print 'button clicked'
self.addButton.bind("<Button-1>", addButton_click)
我相信即使从另一个类使用它仍然可以工作:
class X:
def addButton_click(self, event):
print 'button clicked'
...
inst = X()
self.addButton.bind("<Button-1>", inst.addButton_click)
答案 2 :(得分:0)
这样的事情:
#add Isosurface button
def addIso(event):
#trigger event
self.addButton = tk.Button(self.leftFrame, text="Add") #.grid(column=3, row=1)
self.addButton.pack(in_=self.leftFrame, side="right", pady=2)
self.addButton.bind("<Button-1>", addIso)
来自:http://www.bembry.org/technology/python/notes/tkinter_3.php
答案 3 :(得分:0)
如果您在Windows Presentation Foundation(WPF)中使用IronPython,则可以在Ironpython \ Tutorial目录中找到pyevent.py。这可以让你写下这样的东西:
import clr
clr.AddReferenceByPartialName("PresentationFramework")
import System
import pyevent
class myclass(object):
def __init__(self):
self._PropertyChanged, self._OnPropertyChanged = pyevent.make_event()
self.initialize()
def add_PropertyChanged(self, handler):
self._PropertyChanged += handler
def remove_PropertyChanged(self, handler):
self._PropertyChanged -= handler
def raiseAPropertyChangedEvent(self, name):
self._OnPropertyChanged(self, System.ComponentModel.PropertyChangedEventArgs(name))