Event in Code auslösen

Plattformunabhängige GUIs mit wxWidgets.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Event in Code auslösen

Beitragvon gorba » Donnerstag 1. Februar 2007, 08:06

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
Zuletzt geändert von gorba am Donnerstag 1. Februar 2007, 08:40, insgesamt 1-mal geändert.
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Re: Event in Code auslösen

Beitragvon Francesco » Donnerstag 1. Februar 2007, 08:38

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.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Donnerstag 1. Februar 2007, 08:51

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
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Donnerstag 1. Februar 2007, 11:13

Hallo, vielleicht siehst du dir das sample an:

Demos\wxPython\samples\wxPIA_book\Chapter-03\customEvent.py
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Donnerstag 1. Februar 2007, 11:39

sry, komm nicht nach, was für ein pfad ist das?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Donnerstag 1. Februar 2007, 11:56

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
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Donnerstag 1. Februar 2007, 12:22

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.
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Donnerstag 1. Februar 2007, 14:09

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?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Donnerstag 1. Februar 2007, 14:59

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)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Donnerstag 1. Februar 2007, 18:32

Nur so eine Idee:
Vielleicht reicht es ja schon, wenn Du den Window-Style des Buttons in wx.SUNKEN_BORDER änderst.
MfG
HWK
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Freitag 2. Februar 2007, 13:44

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?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 2. Februar 2007, 14:30

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=]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.[/code]MfG
HWK
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Freitag 2. Februar 2007, 14:44

kann man dann wenigstens die Farbe wechseln?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 2. Februar 2007, 21:55

Ja, mit SetForeGroundColour().
MfG
HWK
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Beitragvon gorba » Montag 5. Februar 2007, 09:04

danke für eure hilfe! Hat mich schonmal weitergebracht
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder