Problem mit wx.panel / wx.sizer

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Moin,
ich sitz grad an meiner ersten GUI mit wxPython und so ganz blick ich das mit wx.panel und den div. sizern nicht.

Ich hab ein Frame mit Toolbar und Statusbar.
Und jetzt will ich einige Labels und TextEntrys in den Raum dazwischen packen. Nur packt mir wx das immer alles in die Linke obere Ecke über die Toolbar.

Hat jemand ein gutes Codesnippet das ne Toolbar, Statusbar und irgendwas dazwischen hat, das ich mir mal anschauen kann?
Auch aus wxPython in Action werd ich in dem Punkt nicht schlau.

Hier ist mal der Rest meines Codefetzens der nach etlichen rumprobieren noch übrig ist.

Code: Alles auswählen

class MyFrame(wx.Frame, threading.Thread):
    def __init__(self, parent = None, id = -1, title = "SMS"):
        wx.Frame.__init__(self, parent, id, title, size)
        self.panel = wx.Panel(self, size=(400, 400))
        #fgs = wx.FlexGridSizer(3, 3, 5, 5)
        
        #self.smstext_label = wx.StaticText(self.panel, -1, "Nachricht:")
        #hl = wx.StaticLine(self.panel)
        ##self.smstext_entry = wx.TextCtrl(self, -1, size=(150, 100), style=wx.TE_MULTILINE)
        
        #self.nummer_label = wx.StaticText(self, -1, "Handynummer:")
        #self.land_label = wx.StaticText(self, -1, "(+0049) - ")
        #self.nummer_entry = wx.TextCtrl(self, -1, validator=NummerValidator())
        
        #fgs.Add(self.smstext_label, 0, wx.ALIGN_CENTER)
        ##fgs.Add(self.smstext_entry, 0, wx.ALIGN_CENTER)
        #fgs.Add(self.land_label, 0, wx.ALIGN_CENTER)
        #fgs.Add(self.nummer_label, 0, wx.ALIGN_CENTER)
        #fgs.Add(self.nummer_entry, 0, wx.ALIGN_CENTER)
        #self.panel.SetSizer(fgs)
        ##sizer.Fit(self)
     
        
        
        self.ToolBar()
        # Statusbar #
        self.statusbar = ESB.EnhancedStatusBar(self, -1)
        self.statusbar.SetFieldsCount(2)
        self.SetStatusBar(self.statusbar)        
        self.statusbar.SetStatusWidths([-4, -2])
        self.Center()
        self.Show()

#### Hier kommt dann noch so ziemlich viel ####
Thx für die Hilfe
Gruß
Damaskus
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Damaskus hat geschrieben:Hat jemand ein gutes Codesnippet das ne Toolbar, Statusbar und irgendwas dazwischen hat, das ich mir mal anschauen kann?
Hi Damaskus!

Ich werden an mein Basisbeispiel noch eines mit ein paar Steuerelementen (Widgets) dazuzaubern.

http://www.python-forum.de/topic-5722.html

Ich geb dir hier bescheid, wenn es fertig ist.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Danke!

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

...erledigt!

Die Anordnung der Widgets passiert in wxPython mit Hilfe von Sizern. Es gibt mehrere davon.

Der ``wx.BoxSizer(wx.VERTICAL)`` ordnet alle an diesen Sizer übergebenen Widgets untereinander an.

Der ``wx.BoxSizer(wx.HORIZONTAL)`` ordnet alle an diesen Sizer übergebenen Widgets nebeneinander an.

Der ``wx.FlexGridSizer(cols = 2)`` ordnet alle an diesen Sizer übergebenen Widgets in einer Tabelle an. Die ersten zwei Widgets kommen in die erste Zeile. Die nächsten zwei in die zweite Zeile, usw.

Beim übergeben eines Widgets an den Sizer, kann man angeben ob und in welche Richtung das Widget gestreckt werden soll.
Beim ``wx.BoxSizer(wx.VERTICAL)`` kann man mit Hilfe des Parameters "proportion" angeben, wie viel Platz ein Widget vom Gesamtplatz bekommt.
0 bedeutet: so viel es gerade eben mal braucht. Die anderen Zahlen geben die proportion an.

Sind zwei Widgets im Sizer und eines davon hat bei "proportion" eine 1 und das andere Widget bei "proportion" eine 2, dann bekommt das zweite Widget immer doppelt so viel Platz zugewiesen, wie das erste Widget. (1/3 zu 2/3)

Bitte lass dich nicht vom Beispiel überwältigen. Gehe den Code in Ruhe durch und probiere aus was passiert, wenn du etwas änderst.

Seit ich mich mit Sizern auskenne, möchte ich nicht mehr mit einem GUI-Designer arbeiten. Das ist meist langsamer und komplizierter als die Verwendung von Sizern. Außerdem ist die Vererbung von Objekten (Frames, Panels,...) so viel einfacher.

http://www.python-forum.de/post-63786.html#63786

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Wie immer ein megageniales Codesnippet von dir!
Und wie immer hab ich jetzt kapiert wie es geht.

Vielen Dank

Gruß
Damaskus
Antworten