2009-04-14 27 views

Respuesta

0

¿Quiere decir que desea tener un despacho de eventos?

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

En una aplicación de interfaz gráfica de usuario, esta función mensajes de eventos al objeto dest especificado utilizando wxEvtHandler :: AddPendingEvent. De lo contrario, distribuye el evento inmediatamente usando wxEvtHandler :: ProcessEvent. Consulte la documentación correspondiente para obtener detalles (y advertencias).

Incluir archivos

<wx/app.h>

wxPython API docs

+2

No sé C, esto es confuso. ¿Puedes darme la línea de Python que se supone que debo ejecutar? –

+0

Creo que es lo mismo. wx.core.PostEvent? Check: http://www.google.com/codesearch?q=wxPostEvent&hl=en&btnG=Search+Code –

+0

No lo veo en el espacio de nombres wx principal, ni en el espacio de nombres del evento. –

48

Tema anterior, pero creo que lo he descifrado después de estar confundido por mucho tiempo, por lo que si alguien más viene por aquí en busca de la respuesta, esto podría ayudar.

Para contabilizar manualmente un evento, puede utilizar

self.GetEventHandler().ProcessEvent(event) 

(docs wxWidgets here, documentos wxPython here)

o

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

(wxWidgets docs, wxPython docs)

donde event es el evento que desea publicar. Construya el evento con, p.

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

si desea publicar un evento EVT_BUTTON. Convertirlo en PyCommandEvent significa que se propagará hacia arriba; otros tipos de eventos no se propagan por defecto.

También puede crear eventos personalizados que pueden transportar los datos que desee. He aquí un ejemplo:.!

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 

(creo que he encontrado este código en un archivo de la lista de correo en algún lugar, pero me parece que no puede encontrar otra vez Si esta es tu ejemplo, gracias Por favor, añadir un comentario y tomar crédito por eso!)

Así que ahora, para publicar un evento personalizado:

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

y se puede unir al igual que cualquier otro evento

self.Bind(EVT_CUSTOM, self.on_event) 

y obtener los datos personalizados en el controlador de eventos

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

O incluya los datos personalizados en el constructor de eventos y guarde un paso:

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

etc.

la esperanza que esto sea útil a alguien.

5

Hay una manera simple, fácil de hacerlo con las versiones recientes de wxPython (véase 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) 
Cuestiones relacionadas