Seite 1 von 1

Event in Code auslösen

Verfasst: Donnerstag 1. Februar 2007, 08:06
von gorba
Hallo

Habe ein kleines Problem. Ich möchte gerne ohne die Intervention eines Users, einen Button "anklicken", so dass er gedrückt ist, bis ich sage ich lasse ihn wider los.

Ich habe die Events EVT_LEFT_DOWN und EVT_LEFT_UP gefunden, allerdings weiss ich nicht, wie ich sie manuell im code auslösen kann.

Kann mir jemand helfen? Thx

ps: code den ich bisher habe:

Code: Alles auswählen

        newE = wx.CommandEvent(wx.EVT_LEFT_DOWN, 666)
        self.gui_inst.GetEventHandler().ProcessEvent(newE)
und die Fehlermeldung:
rec_down:
command handler for key.down throwed exception
Traceback (most recent call last):
File "/home/gasserph/work/mbus/pyMbus-0.8.7/mbus/entity.py", line 230, in incomingMessage
if not self.__callbacks[ cmd.name ]( m ):
File "not_simple_srv.py", line 53, in rec_down
newE = wx.CommandEvent(wx.EVT_LEFT_DOWN, 666)
File "/usr/lib/python2.3/site-packages/wxPython/events.py", line 153, in __init__
self.this = eventsc.new_wxCommandEvent(*_args,**_kwargs)
TypeError: an integer is required
Exception exceptions.AttributeError: "wxCommandEvent instance has no attribute 'thisown'" in ignored

Re: Event in Code auslösen

Verfasst: Donnerstag 1. Februar 2007, 08:38
von Francesco
gorba hat geschrieben:Hallo

Habe ein kleines Problem. Ich möchte gerne ohne die Intervention eines Users, einen Button "anklicken", so dass er gedrückt ist, bis ich sage ich lasse ihn wider los.

Ich habe die Events EVT_LEFT_DOWN und EVT_LEFT_UP gefunden, allerdings weiss ich nicht, wie ich sie manuell im code auslösen kann.

Kann mir jemand helfen? Thx
Hallo,

keine genaue Antwort, aber so in etwa:

suche einmal nach AddPendingEvent

aufruf so in der Form:

<dein wxwidtgetsobjekt>.GetEventHandler().AddPendingEvent( event )

dein wxwidtgetsobjekt: z.B. eine ListCtrl Instanz.

event = wx.Event oder wx.MouseEvent, ...
dann die event paramter setzen.
uz.B.

Verfasst: Donnerstag 1. Februar 2007, 08:51
von gorba
hmm komme bei deiner Beschribung nicht gnaz nach.

Ich soll also einen Event als "Pending" aufgeben
Und wie wird der dann ausgeführt?

Hab den bisherigen code in meinem ersten post hinzugefügt

Mein Problem ist eigentlich, dass der Button "heruntergedrück" wird, auch wenn das der user nicht tut, sondern der code.
Der Buttons soll also eigentlich einen anderen Modus/Aussehen annehmen

------- Edit ------

Habs mit AddPendingEvent versucht, wie dus gesagt hast:

Code: Alles auswählen

        newEv = wx.CommandEvent(wx.wxEVT_LEFT_DOWN, 666)
        newE = self.gui_inst.buttons[0].AddPendingEvent(newEv)
        self.gui_inst.GetEventHandler().ProcessEvent(newE)
Hab aber diese Fehlermeldung gekriegt:

Code: Alles auswählen

rec_down: 
command handler for key.down throwed exception
Traceback (most recent call last):
  File "/home/gasserph/work/mbus/pyMbus-0.8.7/mbus/entity.py", line 230, in incomingMessage
    if not self.__callbacks[ cmd.name ]( m ):
  File "not_simple_srv.py", line 57, in rec_down
    self.gui_inst.GetEventHandler().ProcessEvent(newE)
  File "/usr/lib/python2.3/site-packages/wxPython/windows.py", line 30, in ProcessEvent
    val = windowsc.wxEvtHandler_ProcessEvent(self, *_args, **_kwargs)
TypeError: Type error in argument 2 of wxEvtHandler_ProcessEvent. Expected _wxEvent_p

Verfasst: Donnerstag 1. Februar 2007, 11:13
von Francesco
Hallo, vielleicht siehst du dir das sample an:

Demos\wxPython\samples\wxPIA_book\Chapter-03\customEvent.py

Verfasst: Donnerstag 1. Februar 2007, 11:39
von gorba
sry, komm nicht nach, was für ein pfad ist das?

Verfasst: Donnerstag 1. Februar 2007, 11:56
von Francesco
gorba hat geschrieben:sry, komm nicht nach, was für ein pfad ist das?
Wenn du Windows (und natürlich Demos und Docs) installiert hast, ist es bei mir:
C:\Programme\wxPython2.8 Docs and Demos\wxPython\samples\wxPIA_book\Chapter-03\customEvent.py

Verfasst: Donnerstag 1. Februar 2007, 12:22
von gorba
ok habs gefunden.

Aber da versteh ich wohl noch zu wenig von Python um das auf meinen Fall anzuwenden.

Der Code ruft ja einen eigenen event auf. Ich will eigentlich nur wx.EVT_LEFT_DOWN aufrufen, den es ja schon gibt.

Verfasst: Donnerstag 1. Februar 2007, 14:09
von gorba
gorba hat geschrieben:

Code: Alles auswählen

rec_down: 
command handler for key.down throwed exception
Traceback (most recent call last):
  File "/home/gasserph/work/mbus/pyMbus-0.8.7/mbus/entity.py", line 230, in incomingMessage
    if not self.__callbacks[ cmd.name ]( m ):
  File "not_simple_srv.py", line 57, in rec_down
    self.gui_inst.GetEventHandler().ProcessEvent(newE)
  File "/usr/lib/python2.3/site-packages/wxPython/windows.py", line 30, in ProcessEvent
    val = windowsc.wxEvtHandler_ProcessEvent(self, *_args, **_kwargs)
TypeError: Type error in argument 2 of wxEvtHandler_ProcessEvent. Expected _wxEvent_p
kann damit wer was anfangen?

Verfasst: Donnerstag 1. Februar 2007, 14:59
von Francesco
Eigentlich brauchst du eventuell gar nicht das GetEventHandler, es liefert nur die Instanz des aktuellen Objekts zurück.

Bei ProcessEvent übergibts du nicht dein kreiiertes Event, sondern du mussst newEv übergeben.

Es ist fast gleich ob du ProcessEvent oder AddPending event aufrufst.

Lt. Doku:
The difference between sending an event (using the ProcessEvent method) and posting it is that in the first case the event is processed before the function returns, while in the second case, the function returns immediately and the event will be processed sometime later (usually during the next event loop iteration).

Also:

Code: Alles auswählen

newEvt = wx.CommandEvent(wx.wxEVT_LEFT_DOWN, 666)
#(oder eventuell wx.MouseEvent)
self.gui_inst.ProcessEvent(newEvt)

Verfasst: Donnerstag 1. Februar 2007, 18:32
von HWK
Nur so eine Idee:
Vielleicht reicht es ja schon, wenn Du den Window-Style des Buttons in wx.SUNKEN_BORDER änderst.
MfG
HWK

Verfasst: Freitag 2. Februar 2007, 13:44
von gorba
HWK hat geschrieben:Nur so eine Idee:
Vielleicht reicht es ja schon, wenn Du den Window-Style des Buttons in wx.SUNKEN_BORDER änderst.
MfG
HWK
ja das würde reichen! Wie kann man den style eines Buttons ändern?
Ich habe es so versucht:

Code: Alles auswählen

self.myfooButton.style = wx.SUNKEN_BORDER
Allerdings hatte das keinerlei effekt auf meinen Button.

Oder wo finde ich eine umfassende dokumentation zu diesen dingen?

Verfasst: Freitag 2. Februar 2007, 14:30
von HWK
Dazu dient eigentlich self.myfooButton.SetWindowStyle(wx.SUNKEN_BORDER) und self.myfooButton.Refresh(). Ich hab's aber auch gerade mal probiert. Hatte ebenfalls keinen Effekt. Scheinbar kann man bei Buttons diesen Stil nicht ändern.

Code: Alles auswählen

virtual void SetWindowStyleFlag(long style)

Sets the style of the window. Please note that some styles cannot be changed after the window creation and that Refresh() might be called after changing the others for the change to take place immediately.

See Window styles for more information about flags.
MfG
HWK

Verfasst: Freitag 2. Februar 2007, 14:44
von gorba
kann man dann wenigstens die Farbe wechseln?

Verfasst: Freitag 2. Februar 2007, 21:55
von HWK
Ja, mit SetForeGroundColour().
MfG
HWK

Verfasst: Montag 5. Februar 2007, 09:04
von gorba
danke für eure hilfe! Hat mich schonmal weitergebracht