BIND mehrere Argumente

Plattformunabhängige GUIs mit wxWidgets.
Antworten
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hallöchen Alle,

also ich wollte meine Buttons über BIND() mit entsprechenden Methoden verbinden, allerdings brauche ich erstens <event> nicht und zweitens will ich andere Argumente übergeben. Nur wie? Das ganze läuft mit wx.

Ich weiß dass es zu diesem Thema schon ein paar Threads gibt, allerdings konnte ich dem nicht so recht glauben was ich da gelesen habe,
http://www.python-forum.de/topic-8000.h ... d+argument
Mir wurde von Leonidas verboten die Methoden in BIND() mit einer Klammer zu versehen. :-) Also z.b. darf ich nicht,

Code: Alles auswählen

        self.histogram = wx.MenuItem(self.analMenu,203,'&Histogram Analyse',
                                     'Show the amplitude appearance of the peaks'
                                     ' depending on time in a 1/50Hz raster.',
                                     kind=wx.ITEM_RADIO)
        self.Bind(wx.EVT_MENU, self.changeAnalysis(arg1,arg2), self.histogram)
Macht ja auch Sinn, denn sonst wird meine Funktion ja immer zu Anfang der Initialisierung meines Programms ausgeführt. Im obigen Link wird das allerdings gemacht. :-( Also was denn nun ? Der darf und ich nicht ? :-)

Grüße Markus
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

In dem Thread, auf den du verlinkst, taucht irgendwo ein "lambda" auf. Vielleicht solltest du das in deine Überlegungen einbeziehen.

Sonst gibt es auch noch functools.partial, oder du definierst einfach eine zweite Funktion, die etwas komplexeres macht und die Parameter hält, und übergibst diese.
Das Leben ist wie ein Tennisball.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

Das Lambda in Zeile 8 habe ich gesehen, aber es sagt mir nix. Und ich habe auch nie was von einem : in Bind() gelesen. Was soll das ? Eventuell ist es eine Abfrage auf True ? In Zeile 9 ist allerdings ein Methoden Aufruf mit übergebenden Argument ohne lambda. Ich hätte das schon gerne direkt hier rein gebaut, wenn das geht, finde ich nämlich übersichtlicher. Ist das möglich ?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

lambda findest Du in der Dokumentation und unter 1001 Link beschrieben, wenn Du nach "Python" und "lambda" googelst.

Argumentübergabe geht so, wie Du Dir das vorstellst, in Bind nicht. EyDu hat - wieder mal vor mir ;-) - einen Weg angegeben. Einen anderen wählt BJ im verlinkten Thread. Du kannst auch in den Funktionen das event ansprechen, aber das ist wahrscheinlich nicht, was Du willst.

Was möchtest Du denn eigentlich machen?

Gruß,
Christian
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

CM hat geschrieben: EyDu hat - wieder mal vor mir ;-) - einen Weg angegeben.
Ich stecke eben mitten in meiner Masterarbeit. Da finden sich ja bekanntlich immer Zeit für Internet, Putzen, Kochen und andere wichtige Dinge :roll:
Das Leben ist wie ein Tennisball.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

CM hat geschrieben:Was möchtest Du denn eigentlich machen?
Ich wollte versuchen möglichst alles modular in meinem Programm umzugestallten, sprich möglichst keine globalen Variablen und am besten nur alles übergeben und mit return die nötigen Sachen zurückgeben, damit ich meine Module vielleicht auch woanders einbauen kann. :-)

Und bei Bind() nutze ich teilweise Funktionen die über self.variable u.s.w zugreifen, was das ganze nicht wirklich modular macht.

Grüße Markus
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

EyDu hat geschrieben:Ich stecke eben mitten in meiner Masterarbeit. Da finden sich ja bekanntlich immer Zeit für Internet, Putzen, Kochen und andere wichtige Dinge.
Ging mir ganz ähnlich. Wichtig ist nur, dass Chef und Freundin meinen Du arbeitest ;-).

@feldmann_markus: OK, sind ja gute Gedanken. Aber so ganz klar ist mir das nicht, weil die Parameter für die GUI können innerhalb der GUI quasi "global" sein. Z. B. kann man innerhalb eines Menüs ein Häkchen an der Farbplotoption machen. Das ruft die Handler-Funktion auf. Diese macht aber nicht den Plot, sondern stellt fest, ob jetzt das Häkchen gesetzt ist und ruft dann die plot-Funktion auf - welche auf diese Optionen zurückgreifen kann.

Code: Alles auswählen

    def OnColorPlot(self, event):
        """
            toggles optional color plot
        """
        self.options['color'] = event.IsChecked()
        self.plot_data()
        self.canvas.draw()
        self.toolbar.update()
D. h. es besteht immer (!) eine strikte Trennung zwischen GUI und Daten. Dein Frame-globales options-dict könnte denn auch die Optionen für Deine Analyse beherbergen. Wäre das eine Lösung für Dich?

Gruß,
Christian
Antworten