Sorry, aber so funktioniert das nicht.
`MyFrame(self)` ist sozusagen ein Neues Widget das du geschrieben hast. Es erwartet bei der Erzeugung (Instanzierung -> ``mf = MyFrame.MyFrame(self)``) ein Parent-Fenster (Elternfenster. Also das darüberliegende Fenster in dem es erzeugt werden soll.) was zu `wx` gehört!
Du kannst ein wx Widget nicht einfach inerhalb einer Klasse instanzieren das nicht von einem anderen wx Objekt (Widget) abgeleitet ist.
Du solltest dich wirklich ein wenig mit den Basics von wxPython beschäftigen, damit du weißt wie das abläuft.
In meinen Beispiel:
Code: Alles auswählen
class MyFrame2(wx.Frame):
def __init__(self,
parent=None,
id=-1,
title = "MyApp"):
wx.Frame.__init__(self, parent, id, title)
[...]
`MyFrame2` ist die Spezialisierung (oder abgeleitete Klasse) `von wx.Frame`. Dieses Fenster wird später das Hauptfenster. Mit `wx.Frame.__init__(self, parent, id, title)` wird der Konstruktor von `wx.Frame`aufgerufen um `MyFrame2` zu initialisieren.
So,
self ist nun `MyFrame2` (sry, ist nicht 100%ig richtig aber weiß momentan nicht wie ich das besser auszudrücken soll

). Das heißt, wenn Du jetzt ein wx Objekt (Widget) in `MyFrame2` erzeugen willst (bzw. wenn es nun darauf draufliegen soll), muss du an das objekt bei `parent`
self angeben. Das ganze muss im Konstruktor stattfinden!
Bei deinem Widget sehe das so aus:
Das `self` "sagt" nun das `MyFrame.MyFrame` in oder auf `MyFrame2` erzeugt werden soll.
So, mal konkreter ohne das ganz wirre Zeug:
Das grundgerüsst für ein wx Programm sieht immer in etwa so aus:
Code: Alles auswählen
import wx
# Das ist die Spezialisierung von `wx.Frame` (Abgeleitet Klasse).
# Diese Spezialisierung wird später das Hauptfenster (Parent-Window)!
# Wenn man ein Hauptfenster erzeugen will, erbt man für gewöhnlich von
# `wx.Frame`
class HauptFenster(wx.Frame):
def __init__(self, parent=None, id=-1, title = "MyApp"):
# den Konstruktor von `wx.Frame` aufrufen. Danach hat deine
# Spezialisierung (abgeleitet Klasse) alle Eigenschaften von `wx.Frame`
# + denen die du hinzufügst.
wx.Frame.__init__(self, parent, id, title)
def main():
# Eine Instanz von `wx._core.PySimpleApp` erzeugen.
app = wx.PySimpleApp()
# Jetzt wird das Hauptfenster, hier instanziert!
f = HauptFenster()
# Hiermit wird "gesagt" das dass Hauptfenster angezeigt werden soll.
f.Show()
# Da nun, das Hauptfenster bestimmt worden ist (f.Show()), sagen wir jetzt
# dass die Applikation gestartet werden soll und dabei das gerade bestimmte
# Fenster `f` zum Haupotfenster macht!
app.MainLoop()
if __name__ == "__main__":
main()
So, nun hast du ein Huaptfenster. Alle widgents müssen jetzt im Konstruktor des Hauptfensters oder _eines_ anderen Widgets erzeugt werden und nicht außerhalb! In deinem Beispiel hast du den Fehler gemacht, das `mf = MyFrame.MyFrame(self)` außerhalb eines Hauptfensters oder Widgets erzeugt wurden ist
Ein Beispiel wie man jetzt ein Widget im Hauptfenster erzeugt:
Code: Alles auswählen
import wx
class HauptFenster(wx.Frame):
def __init__(self, parent=None, id=-1, title = "MyApp"):
wx.Frame.__init__(self, parent, id, title)
# Wir wollen nun ein Textfeld im Hauptfenster erzeugen.
# So, das Keyword ``parent`` erwartet eine Referenz eines
# wx Hauptfensters oder eines anderen wx Objekts (Widget) _in_ dem es
# erzeugt werden soll. Da wir wollen das es im Hauptfenster erzeugt
# wird, übergeben wir hier `self`
self.Ausgabe_Text = wx.TextCtrl(parent=self, # erwartet eine Referenz...
id=-1,
style=wx.TE_MULTILINE,
)
def main():
app = wx.PySimpleApp()
f = HauptFenster()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
So, und nun sag mal was genau du machen willst. Dann setze ich mich ran und baue dir ein Beispiel.
lg