2010-10-19 92 views
0

如何触发和监听python中的事件?如何触发并侦听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) 
+2

什么样的事件?请更具体一些。 – kanaka 2010-10-19 15:24:30

+0

@kanaka我需要调用一个按钮时调用一个函数。但是这个功能在另一个类中,所以我需要监听这个事件。 – aneuryzm 2010-10-19 15:27:03

+0

通常你使用的UI工具包将决定答案。您使用的是什么UI工具包,您可以发布解释性代码片段。 – kanaka 2010-10-19 15:29:55

回答

0

有该需要两个参数使用TKinter对象绑定功能:第一是代表名称的字符串你想要听的事件(在这种情况下可能是“”),第二种是以触发事件为参数的方法。

例子:

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) 
+0

@ user470379所以你需要在按钮类中有一个类(X)的实例(inst)具有你想要调用的函数(addButton_click)。那我其实不需要绑定,因为我可以直接调用这样的函数吗?我之所以要求参加一个活动,是因为我不想在两个班级之间建立关系。 – aneuryzm 2010-10-19 15:48:01

+0

我还没有使用Python的经验,我需要的东西类似于你在Actionscript中的例子(addEventListener,triggerEvent方法) – aneuryzm 2010-10-19 15:48:41

+0

它取决于其他类中的函数类型。如果它是一个实例方法,那么是的,你需要一个实例。如果它是一个类方法或静态方法,那么你可以在没有实例的情况下使用类本身(在这种情况下,它将是X.addButton_click)。我不确定你想要什么样的关系 - 这听起来像你试图在另一个类中调用函数而不使用其他类。 – user470379 2010-10-19 15:54:39

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

+0

@kanaka谢谢,如果函数addIso在另一个类中呢? – aneuryzm 2010-10-19 15:41:09

+0

您可能需要一个调用实例方法的中间函数,否则事件参数将作为self(实例对象)传递。即在这个例子中addIso会调用myinst.addIso(event)。 – kanaka 2010-10-19 15:45:14

+0

或者您可以使用匿名函数:bind(...,lambda e:myinst.addIso(e)) – kanaka 2010-10-19 15:48:58

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)) 
+0

我没有使用IronPython ..只是预装在Mac OSX上的Python – aneuryzm 2010-10-19 15:45:15

1

根据您的意见,以现有的一些答案,我想你想要的是什么样的pubsub模块。在Tkinter的背景下,事件是单一目的的 - 一个事件触发一个小部件,并且一些处理器处理事件(尽管可能涉及多个处理程序)。

它听起来像你想要的是更多的广播模型 - 你的小部件说“嘿,用户做了什么”,任何其他模块可以注册兴趣和获得通知,而不知道具体是什么小部件或低级别事件造成的即将发生。

我在支持插件的应用程序中使用它。插件可以说类似于“用户打开新文件时调用我的'打开'方法”。他们不关心用户如何操作(即:是从文件菜单,还是工具栏图标或快捷方式),只是它发生了。

在这种情况下,您可以配置按钮以调用特定的方法,通常位于创建按钮的相同模块中。然后,该方法将使用pubsub模块发布其他模块侦听和响应的一些通用事件。