2009-04-14 19 views

risposta

0

Vuoi dire che desideri una spedizione evento?

:: wxPostEvent vuoto wxPostEvent (wxEvtHandler * dest, wxEvent & evento)

In un'applicazione GUI, questa funzione messaggi di eventi all'oggetto specificato dest utilizzando wxEvtHandler :: AddPendingEvent. In caso contrario, invia immediatamente l'evento utilizzando wxEvtHandler :: ProcessEvent. Vedere la documentazione corrispondente per i dettagli (e avvertimenti).

Includere file

<wx/app.h>

wxPython API docs

+2

Non so C, questo è fonte di confusione. Puoi darmi la linea Python che dovrei correre? –

+0

Penso che sia lo stesso. wx.core.PostEvent? Controllare: http://www.google.com/codesearch?q=wxPostEvent&hl=it&btnG=Search+Code –

+0

Non lo vedo nello spazio dei nomi wx principale, né nel namespace di Event. –

48

Vecchio argomento, ma penso di averlo capito dopo essere stato confuso per un lungo periodo, quindi se qualcun altro arriva qui cercando la risposta, questo potrebbe aiutare.

di inviare manualmente un evento, è possibile utilizzare

self.GetEventHandler().ProcessEvent(event) 

(documenti wxWidgets here, docs wxPython here)

o

wx.PostEvent(self.GetEventHandler(), event) 

(wxWidgets docs, wxPython docs)

dove event è l'evento che desideri pubblicare. Costruisci l'evento con ad es.

wx.PyCommandEvent(wx.EVT_BUTTON.typeId, self.GetId()) 

se si desidera pubblicare un evento EVT_BUTTON. Rendendolo un PyCommandEvent significa che si propagherà verso l'alto; altri tipi di eventi non si propagano di default.

È inoltre possibile creare eventi personalizzati in grado di trasportare qualsiasi dato desiderato. Ecco un esempio:.!

myEVT_CUSTOM = wx.NewEventType() 
EVT_CUSTOM = wx.PyEventBinder(myEVT_CUSTOM, 1) 

class MyEvent(wx.PyCommandEvent): 
    def __init__(self, evtType, id): 
     wx.PyCommandEvent.__init__(self, evtType, id) 
     myVal = None 

    def SetMyVal(self, val): 
     self.myVal = val 

    def GetMyVal(self): 
     return self.myVal 

(Credo di avere trovato questo codice in un archivio di mailing list da qualche parte, ma io non riesco a trovare di nuovo se questo è il vostro esempio, grazie Si prega di aggiungere un commento e prendere credito per questo!)

Così ora, per pubblicare un evento personalizzato:

event = MyEvent(myEVT_CUSTOM, self.GetId()) 
event.SetMyVal('here is some custom data') 
self.GetEventHandler().ProcessEvent(event) 

e si può legare come qualsiasi altro evento

self.Bind(EVT_CUSTOM, self.on_event) 

e ottenere i dati personalizzati nel gestore di eventi

def on_event(self, e): 
    data = e.GetMyVal() 
    print 'custom data is: {0}'.format(data) 

Oppure includere i dati personalizzati nel costruttore di eventi e salvare un passo:

class MyEvent(wx.PyCommandEvent): 
    def __init__(self, evtType, id, val = None): 
     wx.PyCommandEvent.__init__(self, evtType, id) 
     self.myVal = val 

ecc

Spero che questo è utile a qualcuno.

5

C'è un modo semplice semplice per farlo con le versioni recenti di wxPython (vedi http://wiki.wxpython.org/CustomEventClasses):

# create event class 
    import wx.lib.newevent 
    SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent() 

    # post it, with arbitrary data attached 
    wx.PostEvent(target, SomeNewEvent(attr1=foo, attr2=bar)) 

    # bind it as usual 
    target.Bind(EVT_SOME_NEW_EVENT, target.handler) 
Problemi correlati