optionales event handling?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

Hi,

nur mal so aus interesse. kann man bei wxpython eine funktion schreiben, die "optional" ein event behandelt? als pseudocode haette ich mir sowas gedacht

Code: Alles auswählen

def aFunction(self, parameter, optional(event)):
    do_something
mir ist nur aufgefallen, dass ich manchmal eine funktion hatte, die ich auch gerne ausfuehren wuerde bei der intialisierung (zum beispiel um den Pfad fuer eine datei zu definieren) und dann spaeter auf z.B. Radiobox wechsel oder knopfdruck, um selbigen pfad neu zu definieren. Bei einem braeuchte ich kein event handling, beim anderen aber schon.

Bis jetzt habe ich immer nach einer weile einen besseren work around bewerkstelligt, aber es waere nuetzlich zu wissen, ob sowas denn geht.

Ich habe zu optionalem event handling wenig nach eine google suche gefunden. das wenige war nicht sehr hilfreich.

Schon mal vielen Dank fuer die Vorschlaege/Ideen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst natürlich eine Funktion schreiben und None als Default-Argument nutzen und dann einfach prüfen ob etwas anderes als None übergeben wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Oder... du trennst die Funktionalität und das Reagieren in verschiedene Funktionen.

Code: Alles auswählen

def set_path(self, path):
    # do it

def on_set_path(self, event):
    path = "..."
    self.set_path(path)
so könntest du die Funktionalität auch in ein anderes Modul packen, und von der Gui trennen...
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@ Leonidas:

meinst du sowas wie:

Code: Alles auswählen

def aFunction(self, parameter, event=None):
    do_something
falls du das meinst, bin ich ueberrascht, dass das funktioniert...

@ .robert

Das ist eigentlich genau das, was ich vermeiden wollte, weil die funktion ja wirklich nur fuer die initialisierung waere und somit unnoetig code dazu addiert und evtl verwirrend ist, weil sehr gleichklingend.

Ich habe auf bloed mal versucht, ob man eine art operator overloading machen kann wie bei java, aber das ging ziemlich episch in die hose. das geht soweit ich das weiss nur mit methoden die mit __methode__ gekenzeichnet sind (ist das richtig?)
BlackJack

@Nebelhom: Nein überladen aufgrund einer Methodensignatur geht gar nicht. Überschreiben geht, aber das geht auch mit jeder Methode und nicht nur mit denen deren Namen mit doppelten Unterstrichen beginnen und enden.

Und Operator-Überladung geht in Java gar nicht -- in Python allerdings schon. Ich glaube Du bringst hier einige Begriffe durcheinander.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Nebelhom hat geschrieben:

Code: Alles auswählen

def aFunction(self, parameter, optional(event)):
    do_something
Naja, eine Event-Handlerfunkion wird von wx so aufgerufen: on_event(event)

D.h. diesen Aufruf muss deine Funktion auch unterstuetzen! Moeglich waere z.B.

Code: Alles auswählen

def on_event(self, event)
def on_event(self, event=None, parameter="")
def on_event(self, event, parameter="")
def on_event(self, event=None, parameter1="", parameter2=0)
...
Da musst du natuerlich evtl einiges an Fallunterscheidungen durchfuehren, also koennte .robert's Vorschlag doch der bessere sein.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@BlackJack: Ja scheint so. waere nicht das erste mal und wird auch nicht das letzte mal sein ;) Was ich versucht habe, wird aber von java unterstuetzt und ich wusste nicht ob das auch in python ging (antwort: geht nicht :roll: ). wie das genau heisst ist mir jetzt muessig nachzuschauen, weil ich ja python programmieren will und ich mit python all das machen kann was ich machen will (bis jetzt). Vergessen wir das also am besten.

@Rebecca:

Ich scheine wirklich einen riecher dafuer zu haben, die konzeptionell schwersten und/oder kompliziertesten loesungswege suchen zu wollen ;) dann bleib ich mal bei meinem urspruenglichen loesungsweg ;)

Danke euch allen fuer die antworten :D
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Klar geht das, mit functools.partial oder lambda.

Code: Alles auswählen

from functools import partial
#---
self.Bind(wx.EVT_BUTTON, partial(self.my_func, 'arg1', 'arg2', arg3='test'), id=111)
# oder
self.Bind(wx.EVT_BUTTON, lambda evt: self.myfunc('arg1', 'arg2', event=evt), id=111)
#---
def my_func(arg1, arg2, arg3=None, event=None):
    pass
//Edit: [ code ] => [ python ]
the more they change the more they stay the same
Antworten