Seite 1 von 1

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

Verfasst: Sonntag 5. Dezember 2004, 00:42
von jens
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...

Verfasst: Sonntag 5. Dezember 2004, 13:06
von Leonidas
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).

Verfasst: Montag 6. Dezember 2004, 13:42
von jens
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 )

Verfasst: Montag 6. Dezember 2004, 13:55
von Leonidas
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)

Verfasst: Montag 6. Dezember 2004, 14:54
von jens
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...

Verfasst: Montag 6. Dezember 2004, 15:02
von Leonidas
Okay, dann kannst du **kwargs wegrationalisieren, oder besser, für die initalisierung des wx.Apps weitergeben.

Verfasst: Donnerstag 9. Dezember 2004, 13:43
von jens
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()