OnInit(self) <-> __init__(self, Variable)

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 5. Dezember 2004, 00:42

Möchte gern einer wx.App beim Init eine Variable übergeben... Nun ist es aber so, das man nur diese komische def OnInit(self) hat... Dem kann man wohl nicht so einfach eine zusätzliche Variable unterschieben...

Meine Lösung war es jetzt einfach eine Hilf's def zu machen:

Code: Alles auswählen

def putVar(self, Variable):
   self.Variable = Variable

app = MyApp(redirect=False)
app.putVar( "BlaBla" )
app.MainLoop()
Schön ist aber was anderes...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 5. Dezember 2004, 13:06

Wie wär's denn mit sowas:

Code: Alles auswählen

import wx

class VarApp(wx.App):
    def __init__(self, *args, **kwargs):
        wx.App.__init__(self, *args)
        print kwargs
        
    def OnInit(self):
        sa = wx.PySimpleApp()
        wx.PySimpleApp.OnInit(sa)
        return True

a = VarApp(0, myvar='abc')
Und dann kannst du in der VarApp.__init__ mit kwargs machen was du willst (aja, die OnInit musst du selbst anpassen, das ist jetzt ein kleiner Hack).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 6. Dezember 2004, 13:42

Ist auch nicht schlecht... Allerdings will ich keine Variable, sondern ein Python-Objekt (eine Klasse) übergeben und das schein mit deiner Variante nicht zu funktionieren...

Ah, doch geht wohl:

Code: Alles auswählen

import wx

class VarApp(wx.App):
    def __init__(self, MyClass, *args, **kwargs):
        wx.App.__init__(self, *args)
        self.MyClass = MyClass
       
    def OnInit(self):
        [BlaBla]

a = VarApp( MyClass, redirect=False )
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 6. Dezember 2004, 13:55

jens hat geschrieben:Ist auch nicht schlecht... Allerdings will ich keine Variable, sondern ein Python-Objekt (eine Klasse) übergeben und das schein mit deiner Variante nicht zu funktionieren...
Nicht? Also bei mir geht das sehr wohl:

Code: Alles auswählen

import wx

class MyClass:
    pass

class VarApp(wx.App):
    def __init__(self, *args, **kwargs):
        wx.App.__init__(self, *args)
        print kwargs
       
    def OnInit(self):
        sa = wx.PySimpleApp()
        wx.PySimpleApp.OnInit(sa)
        return True

# Einmal mit der Klasse
a = VarApp(0, myclass=MyClass)
# und einmal mit einer Instanz einer Klasse
ci = MyClass()
b = VarApp(0, myclass=ci)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 6. Dezember 2004, 14:54

Hast recht... Komisch... Weiß ich auch nicht was ich da falsch gemacht hab... Allerdings finde ich meine Variante dennoch "schöner" weil man schon bei def __init__() sehen kann, was alles erwartet wird...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 6. Dezember 2004, 15:02

Okay, dann kannst du **kwargs wegrationalisieren, oder besser, für die initalisierung des wx.Apps weitergeben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 9. Dezember 2004, 13:43

Mir ist gerade aufgefallen, das man wx.App.__init__(self, *args, **kwargs) als letztes ausführen sollte, wenn eine Variable/Objekt schon in der OnInit() benötigt wird!

Bsp.:

Code: Alles auswählen

class App(wx.App):
    def __init__(self, XRCfile, *args, **kwargs):
        self.XRCfile = XRCfile
        wx.App.__init__(self, *args, **kwargs)

    def OnInit(self):
        self.res = wx.xrc.XmlResource( self.XRCfile, wx.xrc.XRC_NO_SUBCLASSING )
        if self.res.GetVersion() == -1:
            raise 'Datei "%s" nicht gefunden!!!' % self.XRCfile

XRCfile = "\\GUI\\app.xrc"
MyApp = App( XRCfile, redirect=False )
MyApp.MainLoop()
Antworten