wxNotebook::DeleteAllPages() führt zum Absturz

Plattformunabhängige GUIs mit wxWidgets.
Antworten
achim
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2006, 18:48

Freitag 1. Juni 2007, 19:23

Hallo Liebe Community,

Ich bin noch nicht sehr vertraut mit wxPython, deswegen habe ich eine Frage:

Bei meinem Programm führt der Aufruf der Methode wxNotebook::DeleteAllPages() zum Komplettabsturz des Programms.

Meine Klasse erzeugt ein Notebook mit zwei Pages und einem Panel, anschliessend sollen diese Pages dann wieder gelöscht werden. Eigentlich nicht besonders kompliziert, aber beim Aufruf der genannten Methoden kommt es wie gesagt zum Crash.

Weiss einer von euch Rat?

Code: Alles auswählen

class FENotebook (wx.Notebook):

	def __init__ (self, parent):
		wx.Notebook.__init__ (self, parent, -1, style=wx.CLIP_CHILDREN)

	def DelPages (self):
		self.DeleteAllPages ()

	def SetPages (self):

		self.panel = wx.Panel (self, -1, style=wx.CLIP_CHILDREN)
		
		il = wx.ImageList (16, 11)
		idx0 = il.Add (images2.getFlag_DEBitmap ())
		idx1 = il.Add (images2.getFlag_USBitmap ())
		self.AssignImageList (il)
		
		self.AddPage (self.panel, "DE")
		self.AddPage (self.panel, "US")
		
		self.SetPageImage (0, idx0)
		self.SetPageImage (1, idx1)
		
		self.teaserpicture = wx.html.HtmlWindow (self.panel, -1, size = (150, 100), style = wx.html.HW_SCROLLBAR_NEVER)
		self.teaserpicture.SetBorders (0)
		self.teaserpicture.LoadPage ("XXX")

		self.land = wx.TextCtrl (self.panel, -1, u"XXX", size=(125, -1))
		self.text = wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.beschreibung = wx.TextCtrl (self.panel, -1, u"XXX", size=(250, 125), style=wx.TE_MULTILINE )
		self.leistung = wx.TextCtrl (self.panel, -1, u"XXX", size=(250, 125), style=wx.TE_MULTILINE )
		self.part= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.tage= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.sg= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.p1= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.p2= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))
		self.p3= wx.TextCtrl (self.panel, -1, u"", size=(250, -1))
		self.p4= wx.TextCtrl (self.panel, -1, u"", size=(250, -1))
		self.p5= wx.TextCtrl (self.panel, -1, u"", size=(250, -1))
		self.pz= wx.TextCtrl (self.panel, -1, u"XXX", size=(250, -1))


		box1 = wx.BoxSizer(wx.VERTICAL)
		box2 = wx.BoxSizer(wx.HORIZONTAL)
		box3 = wx.BoxSizer(wx.VERTICAL)
		
		box3.Add(self.land, 0, wx.EXPAND)
		box3.Add(self.text, 0, wx.EXPAND)
		box3.Add(self.part, 0, wx.EXPAND)
		box3.Add(self.tage, 0, wx.EXPAND)
		box3.Add(self.sg, 0, wx.EXPAND)
		
		box2.Add(self.teaserpicture, 0, wx.EXPAND)
		box2.Add(box3, 0, wx.EXPAND)
		
		box1.Add(box2, 0, wx.EXPAND)
		box1.Add(self.beschreibung, 0, wx.EXPAND)
		box1.Add(self.leistung, 0, wx.EXPAND)
		box1.Add(self.p1, 0, wx.EXPAND)
		box1.Add(self.p2, 0, wx.EXPAND)
		box1.Add(self.p3, 0, wx.EXPAND)
		box1.Add(self.p4, 0, wx.EXPAND)
		box1.Add(self.p5, 0, wx.EXPAND)
		box1.Add(self.pz, 0, wx.EXPAND)

		self.panel.SetSizer (box1)
		self.panel.Fit ()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 1. Juni 2007, 20:05

achim hat geschrieben:Bei meinem Programm führt der Aufruf der Methode wxNotebook::DeleteAllPages() zum Komplettabsturz des Programms.

Meine Klasse erzeugt ein Notebook mit zwei Pages und einem Panel, anschliessend sollen diese Pages dann wieder gelöscht werden. Eigentlich nicht besonders kompliziert, aber beim Aufruf der genannten Methoden kommt es wie gesagt zum Crash.
Hallo achim!

Gleich vorab ein Hinweis von mir. Gerade bei der GUI-Programmierung ist es für uns leicher, ein Problem zu erkennen und an einer Lösung zu arbeiten, wenn du uns ein "funktionierendes" Codebeispiel, das den Fehler zeigt, anbietest. Dann müssen wir zum Ausprobieren keine Anwendung um den Codeausschnitt basteln. Ganz besonders wichtig ist das bei "Es stürzt ab und ich weiß nicht warum?"- Fragen :P

Dann noch ein Hinweis von mir:

Code: Alles auswählen

# OK
def name_der_funktion():
# Nicht so schön
def name_der_funktion ():
http://www.python.org/dev/peps/pep-0008/

Vielleicht liegt der Hund hier begraben:

Code: Alles auswählen

        self.AddPage (self.panel, "DE")
        self.AddPage (self.panel, "US")
Du hast nur EIN Panel, verteilst es (inkl. aller Widgets) aber auf zwei Seiten? Ich kann es jetzt nicht testen, aber das könnte es evt. sein.
Ausprobieren musst du es selbst, da du die funktionierende Anwendung hast. :P

Da gibt es noch etwas, was mir auffällt, was dir später um die Ohren fliegen könnte. Du verwendest Bezeichnungen wie Box1, Box2, Box3. Irgendwann wird dein Programm nicht mehr durchschaubar sein. Auch nicht für dich. Verwende aussagekräftigere Bezeichner. Z.B. vbox_settings, hbox_explanations, vbox_valuelist, ...

Das erleichtert das Einfühlen in das Programm sehr. Du musst ja auch daran denken, dass die Proportionen in Richung der Art der Box und wx.EXPAND quer zur Richtung der BoxSizer zu setzen sind. Es ist schön, wenn man schon am Namen erkennt, ob es sich um eine horizontale oder eine vertikale Box handelt. Und es ist auch schön, wenn man am Namen erkennt, dass man gerade mit der Box arbeitet, die die Erklärungen einschließt und nicht mit der Haupt-Box, die um alle Widgets gelegt ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
achim
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2006, 18:48

Freitag 1. Juni 2007, 23:07

Hallo Gerold,

Vielen Dank für deine ausführliche Antwort!
Gleich vorab ein Hinweis von mir. Gerade bei der GUI-Programmierung ist es für uns leicher, ein Problem zu erkennen und an einer Lösung zu arbeiten, wenn du uns ein "funktionierendes" Codebeispiel, das den Fehler zeigt, anbietest. Dann müssen wir zum Ausprobieren keine Anwendung um den Codeausschnitt basteln. Ganz besonders wichtig ist das bei "Es stürzt ab und ich weiß nicht warum?"- Fragen
Ja, das kann ich verstehen, aber in diesem Fall ist der Programmcode schon so umfangreich und besteht aus mehreren Modulen. Es wäre ziemlich schwierig gewesen, das alles zu posten.
# OK
def name_der_funktion():
# Nicht so schön
def name_der_funktion ():
Das wusste ich nicht, dass man das so nicht machen sollte... :o
Du hast nur EIN Panel, verteilst es (inkl. aller Widgets) aber auf zwei Seiten? Ich kann es jetzt nicht testen, aber das könnte es evt. sein.
Ausprobieren musst du es selbst, da du die funktionierende Anwendung hast.
Genau daran lag es...! :lol:
Da gibt es noch etwas, was mir auffällt, was dir später um die Ohren fliegen könnte. Du verwendest Bezeichnungen wie Box1, Box2, Box3. Irgendwann wird dein Programm nicht mehr durchschaubar sein. Auch nicht für dich. Verwende aussagekräftigere Bezeichner. Z.B. vbox_settings, hbox_explanations, vbox_valuelist, ...
Da hast du zweifellos recht. Allerdings ist mein Programm schon jetzt für mich nicht mehr durchschaubar.... :lol:

Vielen Dank
Achim
Antworten