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

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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