Seite 1 von 1

Event-Handling

Verfasst: Mittwoch 27. September 2006, 13:24
von JR
Hallo!

Ich habe eine wx.ListCtrl() mit

zwei zugewisenen Events. Einmal
wx.EVT_LIST_KEY_DOWN und des weiteren wx.EVT_COMMAND_RIGHT_CLICK.

Im letzten Event wird ein Popupmenü angezeigt.

Nun möchte ich, dass dieses Popupmenü auch angezeigt wird, wenn die Windows-Menütaste (keycode 399) gedrückt wird.
Dies kann ich im Event wx.EVT_LIST_KEY_DOWN leicht feststellen.
Wie kann ich aus dem Event wx.EVT_LIST_KEY_DOWN das Event wx.EVT_COMMAND_RIGHT_CLICK auslösen, um die zugehörige Methode korrekt aufzurufen?

Danke für die hoffentlich erfolgende Hilfe an Alle!

Gruß
JR

Re: Event-Handling

Verfasst: Mittwoch 27. September 2006, 13:45
von Francesco
Wenn ich mir das ListCtrl demo ansehen, funktioniert das mit der Windows menü Taste und mit der rechten Maustaste.
Bei der Windows taste werden aber alle Elemente markiert(?)

Verfasst: Mittwoch 27. September 2006, 13:50
von JR
Merkwürdig, ist mir nicht aufgefallen, doch weißt du, wie ich das o.g. hinbekommen könnte?

Verfasst: Mittwoch 27. September 2006, 13:58
von Francesco
JR hat geschrieben:Merkwürdig, ist mir nicht aufgefallen, doch weißt du, wie ich das o.g. hinbekommen könnte?
Du hast ja sicher das Demo installiert, dort kannst du ja das listctrl demo
anschauen.

Code: Alles auswählen

        self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)

        # for wxMSW
        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
        #oder OnRightDown

        # for wxGTK
        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)

Verfasst: Mittwoch 27. September 2006, 14:03
von JR
Hi Francesco!

Leider hast du meine Frage glaube ich nicht richtig verstanden:
Wie kann ich aus dem Event wx.EVT_LIST_KEY_DOWN das Event wx.EVT_COMMAND_RIGHT_CLICK auslösen, um die zugehörige Methode korrekt aufzurufen?
Gruß
JR

Verfasst: Mittwoch 27. September 2006, 14:27
von Francesco
JR hat geschrieben:Hi Francesco!

Leider hast du meine Frage glaube ich nicht richtig verstanden:
Wie kann ich aus dem Event wx.EVT_LIST_KEY_DOWN das Event wx.EVT_COMMAND_RIGHT_CLICK auslösen, um die zugehörige Methode korrekt aufzurufen?
Gruß
JR
Sorry, ich probiers nochmals. :)

also es genügt eigentlich, wenn du aus der Methode, die von
wx.EVT_LIST_KEY_DOWN aufgerufen wird, die Methode aufrufst, die zum wx.EVT_COMMAND_RIGHT_CLICK gebunden ist?

Oder ist es nötig, ein neues Event zu generieren (von wx.EVT_LIST_KEY_DOWN aus)?

Verfasst: Mittwoch 27. September 2006, 14:35
von JR
Hi!

Also ich müsste in der Methode, die durch wx.EVT_LIST_KEY_DOWN ausgelöst wird, ein Event (wx.EVT_COMMAND_RIGHT_CLICK) generieren.

Denn die Methode, welche zum Event wx.EVT_COMMAND_RIGHT_CLICK gehört, benötigt den Parameter event über welchen ich mehrere wichtige Informationen erhalten kann.
Die Methode beginnt so:

Code: Alles auswählen

def EvtMouseRightClick(self, event):
Hoffe, du hast eine Idee. Letztlich möchte ich in Worten prozedural das Event wx.EVT_COMMAND_RIGHT_CLICK meiner wx.ListCtrl auslösen.

Grüße
JR

Verfasst: Mittwoch 27. September 2006, 14:54
von Francesco
Leider muss ich hier auch passen.

Du muesstes ein Event generieren und dann weiterschicken.
Ich weiss aber nicht, ob das funktioniert.

So auf die Art:

Code: Alles auswählen

    def PostComboBoxSelectedEvent(self, text):
        event = wx.CommandEvent(wx.wxEVT_COMMAND_COMBOBOX_SELECTED, 
                                self.GetId()) #das entsprechende dann generieren
        event.SetString(text) #und andere Parameter setzen
        self.GetEventHandler().ProcessEvent(event) #event verschicken

Verfasst: Mittwoch 27. September 2006, 15:37
von JR
Hi!

In der Zeile

Code: Alles auswählen

eventNew = wx.CommandEvent(wx.EVT_COMMAND_RIGHT_CLICK, self.GetId())
kommt folgende Fehlermeldung:

Code: Alles auswählen

newobj = _core_.new_CommandEvent(*args, **kwargs)
TypeError: argument number 1: a 'number' is expected, 'PyEventBinder(<wx._core.PyEventBinder object at 0x00B15B30>)' is received
Ansonsten gefällt mir das erstmal. Weiß nur nicht, wie man das Objekt wx.CommandEvent instanziert. In der wx.Python-Referenz steht:

wxCommandEvent::wxCommandEvent
wxCommandEvent(WXTYPE commandEventType = 0, int id = 0)
Constructor.

Muss wohl ewig rumprobieren.
So etwas braucht man doch ständig, wenn man seine Objekte auch prozedural etwas machen lassen möchte.

Grüße
JR

Verfasst: Mittwoch 27. September 2006, 15:58
von Francesco
JR hat geschrieben:Hi!

In der Zeile

Code: Alles auswählen

eventNew = wx.CommandEvent(wx.EVT_COMMAND_RIGHT_CLICK, self.GetId())
Hi, das sollte heissen:

Code: Alles auswählen

eventNew = wx.CommandEvent(wx.wxEVT_COMMAND_RIGHT_CLICK, self.GetId())
man beachte das wx nach wx. (wx.wxEVT_COMMAND_RIGHT_CLICK)

Verfasst: Mittwoch 27. September 2006, 16:27
von JR
Hey Francesco!

Es funzt :-)

Ist eine wertvolle und letztlich wie immer kurze Geschichte.

Dank dir!
Viel Spaß noch und beste Grüße
JR

P.S.: Arbeitest du zufällig auch mit Plone? Hab hier schon häufig eine Frage gestellt, auf die keiner richtig reagieren möchte...

Verfasst: Mittwoch 27. September 2006, 18:29
von Francesco
JR hat geschrieben:Hey Francesco!

Es funzt :-)

Ist eine wertvolle und letztlich wie immer kurze Geschichte.

Dank dir!
Viel Spaß noch und beste Grüße
JR

P.S.: Arbeitest du zufällig auch mit Plone? Hab hier schon häufig eine Frage gestellt, auf die keiner richtig reagieren möchte...
Toll, das freut mich! :)

Nein, Plone ist leider ein Fremdwort für mich! :roll:

Verfasst: Mittwoch 27. September 2006, 19:56
von JR
Hi Francesco und alle Anderen!

Wer weiß, warum die zweite print-Zeile in folgendem Code nicht geht, bzw. was mache ich falsch?

Ich brauche eine Event-Id, um ein Event manuell auszulösen:

Code: Alles auswählen

import wx 

print wx.wxEVT_COMMAND_RIGHT_CLICK
print wx.wxEVT_LIST_ITEM_SELECTED
Auslösen möchte ich das Event so ähnlich wie:

Code: Alles auswählen

eventNew = wx.CommandEvent(wx.wxEVT_COMMAND_RIGHT_CLICK, self.GetId())
eventNew.SetClientObject(self)
self.GetEventHandler().ProcessEvent(eventNew)
obiges geht, folgendes geht halt nicht:

Code: Alles auswählen

eventNew = wx.CommandEvent(wx.wxEVT_LIST_ITEM_SELECTED, self.GetId())
eventNew.SetClientObject(self)
self.GetEventHandler().ProcessEvent(eventNew)
Weiß jemand einen Rat?

Grüße und schönen Abend noch!
JR

Verfasst: Donnerstag 28. September 2006, 08:30
von Francesco
JR hat geschrieben:Hi Francesco und alle Anderen!

Wer weiß, warum die zweite print-Zeile in folgendem Code nicht geht, bzw. was mache ich falsch?

Ich brauche eine Event-Id, um ein Event manuell auszulösen:

Code: Alles auswählen

import wx 

print wx.wxEVT_COMMAND_RIGHT_CLICK
print wx.wxEVT_LIST_ITEM_SELECTED
Hallo JR,

aus dem Stegreif weiss ich das auch nie.
Ich machte nur ein Filesearch und kam auf diese Konstante:

wx.wxEVT_COMMAND_LIST_ITEM_SELECTED

Wenn Du dich mehr mit wxPython beschäftigen willst, würde ich die Mailing List kontaktieren. Über gmane ist sie als NNTP zu beziehen, ist viel
angenehmer als als Mailing list.