Wie verschachtelt man mehrere BoxSizer

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

Wie verschachtelt man mehrere BoxSizer

Beitragvon calo » Montag 18. Dezember 2006, 20:06

Hallo wxPython-Gemeinde,

ich versuche derzeit mehrere Widgets auf einem Frame zu verteilen. Die Anordnung ist nicht besonders kompliziert. Aber ich bekomme diese BoxSizer nicht vernünftig verschachtelt. Was mache ich da Falsch?

Code: Alles auswählen

import wx

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

class MyToolBar(wx.Frame):
   def __init__(self, parent, id, title):
      wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350, 250))

      vbox1 = wx.BoxSizer(wx.VERTICAL)
      # vbox2 = wx.BoxSizer(wx.VERTICAL)
      hbox = wx.BoxSizer(wx.HORIZONTAL)

      img_new = wx.Image(r'icon\stock_new.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
      img_open = wx.Image(r'icon\stock_open.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
      img_save = wx.Image(r'icon\stock_save.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
      img_exit = wx.Image(r'icon\stock_exit.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()

      toolbar = wx.ToolBar(self, wx.ID_ANY, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
      toolbar.SetToolBitmapSize(size=(24,24))
      toolbar.AddSimpleTool(wx.ID_ANY, img_new, 'New', '')
      toolbar.AddSimpleTool(wx.ID_ANY, img_open, 'Open', '')
      toolbar.AddSimpleTool(wx.ID_ANY, img_save, 'Save', '')
      toolbar.AddSeparator()
      toolbar.AddSimpleTool(wx.ID_ANY, img_exit, 'Exit', '')
      toolbar.Realize()

      text = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_MULTILINE)

      # button1 = wx.Button(self, wx.ID_ANY, "text-1")
      # button2 = wx.Button(self, wx.ID_ANY, "text-2")
      # vbox2.Add(button1, 0)
      # vbox2.Add(button2, 0)
      # hbox.Add(vbox2, 1)
      # self.SetSizer(vbox2)

      vbox1.Add(toolbar)
      hbox.Add(text, 1, wx.ALL|wx.EXPAND)
      vbox1.Add(hbox, 1, wx.ALL|wx.EXPAND)
      self.SetSizer(hbox)
      self.SetSizer(vbox1)

      self.statusbar = self.CreateStatusBar()
      self.Centre()


class MyApp(wx.App):
   def OnInit(self):
      frame = MyToolBar(None, wx.ID_ANY, 'toolbar.py')
      frame.Show(True)
      return True

app = MyApp(0)
app.MainLoop()


Ich habe eine Toolbar (die Bildchen konnte ich leider nicht übertragen), ein TextCtrl und zwei Buttons. Die Toolbar soll über allem stehen. Unter der Toolbar sollen jeweils rechts und links das TextCtrl-Widget und die Buttons sitzen. Das TExtCtrl soll zu allen Richtungen Expandiert werden (wx.ALL|wx.EXPAND). Die Button jeweils übereinander liegend sollen in der rechten Spalte in der Default-Größe liegen.

Die Anordnung in meinem Script, führt leider nur dazu, dass die Toolbar und das TextCtrl sich teilweise verdecken. Vielleicht kann mir einer von euch helfen.

Grüße, Calo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Wie verschachtelt man mehrere BoxSizer

Beitragvon gerold » Montag 18. Dezember 2006, 22:52

calo hat geschrieben:Vielleicht kann mir einer von euch helfen.

Hi Calo!

Vielleicht bringt dich dieses Beispiel weiter:

Code: Alles auswählen

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

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


class MyToolBarFrame(wx.Frame):
   
    def __init__(self, parent = None, id = -1, title = "toolbar.py"):
        wx.Frame.__init__(self, parent, id, title, size = wx.Size(350, 250))
       
        # Panel (Jedes Widget sollte in einem Panel liegen, damit es sich
        #        unter jeder Plattform wie gewohnt anfühlt...)
        # Das Panel ist das erste Widget im Frame. Deshalb nimmt es den gesamten
        # Platz ein.
        panel = wx.Panel(self)
       
        # vbox_main (Alles ist in diesem Sizer)
        # Der Sizer "vbox_main" wird an das Panel gebunden. Somit ist dieser
        # Sizer der Hauptsizer, in das alles rein muss. (Bis auf das Menü, die
        # Toolbar und die Statuszeile. Diese werden immer an den Frame gebunden.)
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
       
        # Stock-Buttons-Helper
        def get_stock_bitmap(id):
            return wx.ArtProvider.GetBitmap(id, wx.ART_TOOLBAR, wx.Size(24, 24))
       
        # Toolbar
        toolbar = wx.ToolBar(self, -1, style = wx.TB_HORIZONTAL | wx.NO_BORDER)
        toolbar.SetToolBitmapSize(size=(24,24))
       
        toolbar.AddSimpleTool(
            wx.ID_NEW, get_stock_bitmap(wx.ART_NEW), u"Neu", u"Legt etwas neu an"
        )
        toolbar.AddSimpleTool(
            wx.ID_OPEN, get_stock_bitmap(wx.ART_FILE_OPEN), u"Öffnen", u"Öffnet etwas"
        )
        toolbar.AddSimpleTool(
            wx.ID_SAVE, get_stock_bitmap(wx.ART_FILE_SAVE), u"Speichern", u"Speichert etwas"
        )
        toolbar.AddSeparator()
        toolbar.AddSimpleTool(
            wx.ID_EXIT, get_stock_bitmap(wx.ART_QUIT), u"Beenden", u"Beendet das Programm"
        )
        toolbar.Realize()
        self.SetToolBar(toolbar)
       
        # TextCtrl
        text = wx.TextCtrl(panel, -1, '', style = wx.TE_MULTILINE)
        vbox_main.Add(text, 1, wx.EXPAND)
       
        # Sizer für die Buttons (Dieser wird wie das TextCtrl in den Hauptsizer
        # "vbox_main" gelegt.
        hbox_buttons = wx.BoxSizer(wx.HORIZONTAL)
        vbox_main.Add(hbox_buttons, 0, wx.EXPAND)
       
        # Abbrechen-Button
        cmd_cancel = wx.Button(panel, wx.ID_CANCEL, "Abbrechen")
        cmd_cancel.SetToolTipString(u"Bricht etwas ab")
        hbox_buttons.Add(cmd_cancel, 0, wx.ALL, 5)
       
        # Platzhalter zwischen den Buttons, damit diese auseinandergedrückt werden.
        hbox_buttons.Add(wx.Size(0, 0), 1)
       
        # OK-Button
        cmd_ok = wx.Button(panel, wx.ID_OK, "OK")
        cmd_ok.SetToolTipString(u"Bestätigt etwas")
        hbox_buttons.Add(cmd_ok, 0, wx.ALL, 5)
       
        # Statusbar
        self.statusbar = self.CreateStatusBar()
        self.Centre()
 

def main():
    app = wx.PySimpleApp()
    frame = MyToolBarFrame()
    frame.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder