Wie verschachtelt man mehrere BoxSizer

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
Antworten