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

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

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.
Atomkraftwerkaktienbesitzer
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

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()
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

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.
Atomkraftwerkaktienbesitzer
Antworten