Seite 1 von 1

Frage zu wx.App() und OnInit-Methode...

Verfasst: Montag 10. August 2009, 09:44
von mutetella
Hallo,

bin gerade dabei, mich mit "wxPython in Action" und verschiedenen Online-Anleitungen in die Materie einzuarbeiten. Dabei stoße ich immer wieder auf widersprüchliche Aussagen zur Klasse wx.App() und deren OnInit-Methode. Daher meine Fragen:

- Für was braucht es die OnInit-Methode überhaupt. Die Anweisungen innerhalb der OnInit-Methode lassen sich doch auch in die wx.App.__init__-Methode schreiben (wo sie meinem Python-Verständnis nach auch eher hingehören).

Folgender Code

Code: Alles auswählen

class App(wx.App):
    def __init__(self):
        wx.App.__init__(self)
        self.frame = Frame(parent=None, id=-1, size=(800,600), pos=(150,150), title='Test')
        self.frame.Show()
        self.SetTopWindow(self.frame)

if __name__ == '__main__':
    app = App()
    app.MainLoop()
macht doch letztlich keinen Unterschied zu

Code: Alles auswählen

class App(wx.App):
    def __init__(self):
        wx.App.__init__(self)
    
    def OnInit(self):
        self.frame = Frame(parent=None, id=-1, size=(800,600), pos=(150,150), title='Test')
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

if __name__ == '__main__':
    app = App()
    app.MainLoop()
oder?

Und wenn ich überhaupt keine Subclass App() definiere, funktioniert es genauso, siehe:

Code: Alles auswählen

if __name__ == '__main__':
    app = wx.App()
    frame = Frame(parent=None, id=-1, size=(800,600), pos=(150,150), title='Test')
    frame.Show()
    app.SetTopWindow(frame)
    app.MainLoop()
Warum also überhaupt eine Subclass App() definieren? Für mich sieht es einfach so aus, als wäre das irgendwie überflüssig.

Noch eine Frage: Die Methode 'SetTopWindow()' ist doch nicht wirklich notwendig, oder doch?

Ich möchte halt einfach nicht stupide irgendeinen Code aus schlauen Büchern und Tutorials verwenden, der letztlich nicht notwendig ist. Genauso wenig möchte ich vermeintlich unnützen Code weglassen, der dann doch Vorteile mit sich bringt, von denen ich momentan noch nichts weiß... :-)

Danke schon mal für jede Hilfe!!

Liebe Grüße
mutetella

Verfasst: Dienstag 25. August 2009, 01:37
von Ene Uran
Ein paar Fehler, zum Beispiel Frame() ist wx.Frame().

Die OnInit() Methode erlaubt es nur eine Instanze deines Programmes laufen zu lassen:

Code: Alles auswählen

class MyApp(wx.App):
    def OnInit(self):
        name = "SingleApp - %s" % (wx.GetUserId())
        self.instance = wx.SingleInstanceChecker(name)
        # create a title
        mytitle = name
        if self.instance.IsAnotherRunning():
            message = "Another instance of %s is running" % mytitle
            wx.MessageBox(message, "Error")
            return False        
        self.frame = wx.Frame(parent=None, id=-1, size=(400,300), 
            pos=(150,150), title=mytitle)
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

if __name__ == '__main__':
    # error redirection=0 to console
    app = MyApp(0)
    app.MainLoop()
Deutsch ist leider nur meine dritte Sprache, hoffentlich kannst Du alles verstehen.

Verfasst: Dienstag 25. August 2009, 13:08
von mutetella
Ein paar Fehler, zum Beispiel Frame() ist wx.Frame().
Mein Fehler, sorry. Hatte nicht erwähnt, dass Frame() eine Unterklasse von wx.Frame() ist.

Verschiedene Überprüfungsroutinen und "Startarbeiten" gehören demnach in eine Unterklasse von wx.App().
Mir ist allerdings noch nicht klar, weshalb ich eine solche Unterklasse doppelt initialisiere, einmal mit der __init__()-Methode und danach noch mit der OnInit()-Methode.

Gruß
mutetella

Deutsch ist leider nur meine dritte Sprache, hoffentlich kannst Du alles verstehen.
Wäre mein Englisch nur halb so gut wie Dein Deutsch, wäre ich schon sehr glücklich!

Verfasst: Dienstag 25. August 2009, 13:33
von Zap
Es gibt eine OnInit Mehtode da diese erst aufgrufen wird "nachdem" das App Objekt quasi vollständig intitialisiert ist.

Beispiel: ein

Code: Alles auswählen

self.frame = wx.Frame()
funktioniert erst wenn ein App() Exemplar vorhanden ist.

Somit müsste man in der überschriebenen __init__ Methode immer darauf achten in welcher Reihenfolge die Initialisierungen ablaufen.
Wenn man sich auf die OnInit() Methode beschränkt hat man das Problem nicht.

Verfasst: Dienstag 25. August 2009, 18:57
von mutetella
@zap:
Hmm... ehrlich gesagt: Ich kann da nicht ganz folgen. Was meinst Du mit "Reihenfolge der Initialisierungen"? Dass ohne App() nichts geht ist mir schon klar. Ich verstehe nur immer noch nicht, weshalb die Klasse App() beim Initialisieren eine OnInit()-Methode braucht (oder eben nicht?). Alle anderen Klassen werden doch auch über die __init__()-Methode ins Leben gerufen.

Könntest Du vielleicht anhand meiner 3 Beispiele (die ja alle 3 funktionieren) erklären, was Du meinst.

Danke schon mal für die Mühe...!

Gruß
mutetella

Verfasst: Dienstag 25. August 2009, 22:51
von fhoech
Aus der englischen wxPython Doku: "You should override OnInit to do applicaition initialization to ensure that the system, toolkit and wxWidgets are fully initialized."
Ist in wxPython einfach Konvention.
Ausserdem kannst Du in OnInit das wx.App.__init__(self) weglassen:

Code: Alles auswählen

class App(wx.App):
    def OnInit(self):
        self.frame = Frame(parent=None, size=(800,600), pos=(150,150), title='Test')
        self.SetTopWindow(self.frame)  # Kann man auch weglassen, falls man wie in diesem Beispiel nur ein wx.Frame auf oberster Ebene hat
        self.frame.Show()

if __name__ == '__main__':
    app = App()
    app.MainLoop()

Verfasst: Mittwoch 26. August 2009, 07:26
von mutetella
@fhoech:

Danke für Deine Antwort. Endlich etwas Licht... :idea:

In einem Beispiel aus 'wxPython in Action' wurde innerhalb der Unterklasse App(wx.App) eben sowohl die __init__()-Methode wie auch danach die OnInit()-Methode aufgerufen. Und das hat mich einfach voll verwirrt. Und so wirklich erhellendes zum Thema App() und deren Initialisierung hatte ich einfach nicht finden können bzw. widersprechen sich Beispiele öfters mal...

Jedenfalls hat mir das jetzt echt weitergeholfen... :)

Gruß
mutetella

Verfasst: Donnerstag 27. August 2009, 23:10
von Ene Uran
mutetella hat geschrieben:@fhoech:

Danke für Deine Antwort. Endlich etwas Licht... :idea:

In einem Beispiel aus 'wxPython in Action' wurde innerhalb der Unterklasse App(wx.App) eben sowohl die __init__()-Methode wie auch danach die OnInit()-Methode aufgerufen. Und das hat mich einfach voll verwirrt. Und so wirklich erhellendes zum Thema App() und deren Initialisierung hatte ich einfach nicht finden können bzw. widersprechen sich Beispiele öfters mal...

Jedenfalls hat mir das jetzt echt weitergeholfen... :)

Gruß
mutetella
Leider hat das Buch 'wxPython in Action' eine Menge Fehler, und Du bist da einem der Fehler zum Opfer gefallen.