TextCtrl-Element wird nicht auf gesamten Panel vergrößert

Plattformunabhängige GUIs mit wxWidgets.
Antworten
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hallo Python-Gemeinde,

'habe ich folgendes Script:

Code: Alles auswählen

import wx

class EditPanel(wx.Panel):
	def __init__(self, parent):
		p = wx.Panel.__init__(self, parent)
		t = wx.TextCtrl(self, 1, "", style=wx.TE_MULTILINE)

class MainFrame(wx.Frame):
	def __init__(self):
		wx.Frame.__init__(self, None, title="Simple Notebook Example")

		p = wx.Panel(self)
		nb = wx.Notebook(p)
		editPanel = EditPanel(nb)
		nb.AddPage(editPanel, "Edit")

		sizer = wx.BoxSizer()
		sizer.Add(nb, 1, wx.EXPAND)
		p.SetSizer(sizer)


if __name__ == "__main__":
	app = wx.App()
	MainFrame().Show()
	app.MainLoop()
Da ich GUI-Neuling bin, verstehe ich nicht weshalb das TextCtrl-Element in Zeile 6, nicht auf das gesamte Panel ausgebreitet. Was mache ich hier falsch?

(WinXP Home, Python 2.4, wxPython ??)

Gruß, Calo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

calo hat geschrieben:Da ich GUI-Neuling bin, verstehe ich nicht weshalb das TextCtrl-Element in Zeile 6, nicht auf das gesamte Panel ausgebreitet.
Hi Calo!

Willkommen im Python-Forum!

Die Sache ist ganz einfach. Nur das erste Widget, welches auf ein Frame gelegt wird, wird automatisch auf die volle Größe des Frame-Innenraums vergrößert.
Du hast ein TextCtrl auf ein Panel gelegt und dich nicht selbst darum gekümmert, dass es sich an die Größe des Panels anpasst.

Hier ein funktionierendes Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class EditPanel(wx.Panel):

    def __init__(self, parent):
        
        wx.Panel.__init__(self, parent)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        t = wx.TextCtrl(self, 1, "", style = wx.TE_MULTILINE)
        vbox.Add(t, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)


class MainFrame(wx.Frame):

    def __init__(self):
        
        wx.Frame.__init__(self, None, title = "Simple Notebook Example")
        
        p = wx.Panel(self)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        p.SetSizer(vbox)
        
        nb = wx.Notebook(p)
        vbox.Add(nb, 1, wx.ALL | wx.EXPAND, border = 5)
        
        edit_panel1 = EditPanel(nb)
        nb.AddPage(edit_panel1, "Edit 1")
        
        edit_panel2 = EditPanel(nb)
        nb.AddPage(edit_panel2, "Edit 2")


if __name__ == "__main__":
    app = wx.App()
    f = MainFrame()
    f.Center()
    f.Show()
    app.MainLoop()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hallo Gerold,

vielen Dank für die Hilfe. Jetzt funktioniert's :)

Eine kleine Frage habe ich aber immer noch. Und zwar hat es nicht gleich auf Anhieb geklappt (es hatte sich ein kleiner Tippfehler beim Übertragen eingeschlichen). Die Fehlermeldung dazu erschien leider nur ganz kurz auf dem neuen Fenster, so dass ich es gar nicht lesen konnte. Gibt es eine Möglichkeit den Fehlertext in einem abstürzenden Frame abzufangen und zu speichern? ... oder das Frame beim Absturz kurz anzuhalten (eine Art 'pause'-Funktion)?

Danke :)

Grüßle, Calo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

calo hat geschrieben:Die Fehlermeldung dazu erschien leider nur ganz kurz auf dem neuen Fenster
Hi Calo!

Wenn du das Programm nicht über einen Doppelklick auf ein Symbol, sondern über die DOS-Konsole startest, dann bleiben dir auch die Fehlermeldungen erhalten.

- Start --> Ausführen --> ``CMD``
- Dann in den Ordner wechseln, in dem dein Python-Programm ist. (mit ``CD``)
- ``C:\Python24\python.exe NAME_DEINES_PROGRAMMES.PY``
- Bzw: ``NAME_DEINES_PROGRAMMES.PY`` (ohne die Angabe der Python-EXE)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hallo Gerold,

leider ... unabhängig davon wie ich das Script starte, wird der Fehlertext nicht im CMD-Fenster (Eingabeaufforderung, DOS-Shell, oder wie es auch heißen mag ... :wink: ) ausgegeben sondern in einem neu entstehenden Fenster mit dem Titel "stdout/stderr". Ich habe die Beobachtung gemacht, dass wenn ich das Script aus einer Python-Shell heraus starte (>>> execfile('script.py') ) dann das Fehlerfenster länger stehen bleibt. Auf diesem Wege ist die Fehlermeldung lesbar. Versucht man es aber anschließend zu schließen, dann reißt es auch den Python-Interpreter, mit in den Absturz.

Mache ich eine Ausgabe mit Hilfe des 'print'-Befehls, erfolgt dies im CMD-Fenster. 'stderr'-Ausgaben hingegen erfolgen in dem neuen Fenster.

Grüßle, Calo
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Versuch mal

Code: Alles auswählen

    app = wx.App(False)
MfG
HWK
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hallo HWK,

vielen Dank ... jetzt erfolgt die Fehlerausgabe im CMD-Fenster :)

Grüßle, Calo
Antworten