Event-Handling

Plattformunabhängige GUIs mit wxWidgets.
Antworten
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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(?)
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Merkwürdig, ist mir nicht aufgefallen, doch weißt du, wie ich das o.g. hinbekommen könnte?
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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)
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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)?
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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)
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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...
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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:
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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.
Antworten