Search code examples
pythonuser-interfacewxpythonwxwidgets

Is it possible to adapt width wx.StaticBox?


i've made this code :

import wx
import List as li
from ChoiceBook import *

class MainTab(wx.Panel):
   def __init__(self, parent, sb, dm):
    wx.Panel.__init__(self, parent)
    self.parent = parent
    self.hardware = []
    box = wx.StaticBox(self, wx.ID_ANY, "Appareil")
    self.list = li.List(self, sb, dm)
    sizerleft = wx.StaticBoxSizer(box,wx.HORIZONTAL)
    sizerleft.Add(self.list, 1, wx.ALL|wx.EXPAND, 5)




    box = wx.StaticBox(self, wx.ID_ANY, "Mesures")
    self.notebook = Choicebook(self,dm)

    sizerright = wx.StaticBoxSizer(box,wx.HORIZONTAL)
    sizerright.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)



    sizer = wx.BoxSizer(wx.HORIZONTAL)
    sizer.Add(sizerleft, 1, wx.ALL|wx.EXPAND, 5)
    sizer.Add(sizerright, 1, wx.ALL|wx.EXPAND, 5)
    self.SetSizer(sizer)

   def update(self):
       self.notebook.update() 

it made this window, but when i resize it, it dosen't scale the contents. it just crop it, like this.

I think the probleme come from the StaticBox which are static i guess(i'm not sure).

I would like to know if it's possible to make it resize automatically?

or if not is there is another way to make a box whith a title like StaticBox and so make it resizable ?

EDIT: i figure it out with your help. in fact this wasn't this portion of cod fault but my list Class. i just remove all size in that file before

wx.ListCtrl.__init__(self,
                         parent,
                         size=(800, -1),
                         style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
    self.rm = RM.Res_Man()
    self.index = 0

    self.InsertColumn(0, 'Appareil de mesure', width=125)
    self.InsertColumn(1, 'Connecté')
    self.InsertColumn(2, 'ID',width=300)
    self.InsertColumn(3, 'Type',width=290)
    self.sb = sb

after

wx.ListCtrl.__init__(self,
                         parent,
                         style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
    self.rm = RM.Res_Man()
    self.index = 0

    self.InsertColumn(0, 'Appareil de mesure')
    self.InsertColumn(1, 'Connecté')
    self.InsertColumn(2, 'ID')
    self.InsertColumn(3, 'Type')
    self.sb = sb

thanks you all ;)


Solution

  • I think that what you want, is to force it to Layout() on a RESIZE event.
    However, remember that these items will have a minimum size.

    Try this:

    import wx
    
    class MainTab(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None)
            self.hardware = []
            box = wx.StaticBox(self, wx.ID_ANY, "Appareil")
            lc = wx.ListCtrl(self, wx.ID_ANY, style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES)
            lc.InsertColumn(1, "Appareil de mesure")
            lc.InsertColumn(2, "Connecte")
            lc.InsertColumn(3, "ID")
            lc.InsertColumn(4, "Type")
            sizerleft = wx.StaticBoxSizer(box,wx.HORIZONTAL)
            sizerleft.Add(lc, 1, wx.ALL|wx.EXPAND, 5)
    
            box = wx.StaticBox(self, wx.ID_ANY, "Mesures")
            cb = wx.Choicebook(self, wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
                   style=0, name="")
    
            sizerright = wx.StaticBoxSizer(box,wx.HORIZONTAL)
            sizerright.Add(cb, 1, wx.ALL|wx.EXPAND, 5)
    
            sizer = wx.BoxSizer(wx.HORIZONTAL)
            sizer.Add(sizerleft, 1, wx.ALL|wx.EXPAND, 5)
            sizer.Add(sizerright, 1, wx.ALL|wx.EXPAND, 5)
            self.SetSizer(sizer)
            self.Bind(wx.EVT_SIZE, self.ReSize)
    
        def ReSize(self,event):
            self.Layout()
    
    if __name__ == '__main__':
        app = wx.App()
        frame = MainTab()
        frame.Show(True)
        app.MainLoop()
    

    I have had to hack it together as your code is in complete.