2010-10-19 84 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模塊發佈其他模塊偵聽和響應的一些通用事件。