python 3.x - Set a minimal window size so all sizers fit -


i have tried understand how sizer , sizes work clearly, missing vital. get:

bad

clearly, inside panels (sizers) not fit window. want this:

good

which created manual re-size.

how can achieve that?

note real code has many more different wx.staticbox generic explanation of doing wrong more welcome fix.

here toy example code:

import wx import wx.lib.agw.floatspin fs   class guicontrol(wx.frame):      def __init__(self, parent, id, title, *args, **kwargs):         super(guicontrol, self).__init__(parent, id, title, *args, **kwargs)         self.radio = {}         self.modes = ['open loop', 'current control', 'voltage control']         panel = wx.panel(self)         panel.setbackgroundcolour('#5968c3')         sizer = wx.boxsizer(wx.vertical)         sizer.add(self._ui(panel), 1, wx.expand | wx.all, 3)         panel.setsizer(sizer)         print(sizer.computefittingwindowsize(self))         self.setsize(sizer.computefittingwindowsize(self))         self.centre()         self.show(true)      def _ui(self, parent):         panel = wx.panel(parent)         vbox = wx.boxsizer(wx.vertical)         flags = wx.expand | wx.shaped         vbox.add(self._ui_prefix(panel), flag=wx.expand)         vbox.add(self._ui_control_mode(panel), flag=flags)         vbox.add(self._ui_suffix(panel), flag=wx.expand)         panel.setsizer(vbox)         return panel      def _ui_prefix(self, parent):         panel = wx.panel(parent)         panel.setbackgroundcolour('steelblue')         hbox = wx.boxsizer(wx.horizontal)         _label = wx.statictext(panel, label='')         _label.setlabelmarkup("<b><i><big>controls</big></i></b>")         hbox.add(_label, flag=wx.align_center | wx.all)         panel.setsizer(hbox)         return panel      def _ui_control_mode(self, parent):         box = wx.staticbox(parent, -1, "control mode")          _label_modes = wx.statictext(box, label='')         _label_modes.setlabelmarkup("<i>modes</i>")         item in self.modes:             self.radio[item] = wx.radiobutton(box, -1, item)          _label_duty = wx.statictext(box, label='')         _label_duty.setlabelmarkup("<i>duty cycle</i>")         self.sc1 = wx.spinctrl(box, wx.id_any, '0', min=0, max=100)         _units_duty = wx.statictext(box, label='%')          _label_current = wx.statictext(box, label='')         _label_current.setlabelmarkup("<i>current</i>")         self.sc2 = fs.floatspin(box,                                 wx.id_any,                                 value=0.0,                                 min_val=0.0,                                 max_val=20.0,  # fixme                                 increment=0.1)         self.sc2.setformat("%f")         self.sc2.setdigits(1)         _units_current = wx.statictext(box, label='a')          fgs = wx.flexgridsizer(5, 3, 5, 7)         flags = wx.expand | wx.all | wx.shaped          fgs.add(_label_modes, 0, flags)         fgs.add(self.radio['open loop'], 0, flags)         fgs.addstretchspacer()          fgs.addstretchspacer()         fgs.add(self.radio['current control'], 0, flags)         fgs.addstretchspacer()          fgs.addstretchspacer()         fgs.add(self.radio['voltage control'], 0, flags)         fgs.addstretchspacer()          fgs.add(_label_duty, 0, flags)         fgs.add(self.sc1, 0, flags)         fgs.add(_units_duty, 0, flags)          fgs.add(_label_current, 0, flags)         fgs.add(self.sc2, 0, flags)         fgs.add(_units_current, 0, flags)          fgs.setsizehints(box)         fgs.layout()         box.setsizer(fgs)         return box      def _ui_suffix(self, parent):         panel = wx.panel(parent)         panel.setbackgroundcolour('steelblue')         hbox = wx.boxsizer(wx.horizontal)         hbox.add(wx.boxsizer(wx.vertical),                  flag=wx.reserve_space_even_if_hidden)         _quit = wx.button(panel, -1, label=" quit ")         _quit.setbackgroundcolour('#5968c3')         _quit.bind(wx.evt_button, self.onquit)         hbox.addstretchspacer()         hbox.add(_quit, flag=wx.align_center | wx.shaped | wx.all, border=3)         hbox.addstretchspacer()         panel.setsizer(hbox)         return panel      def onquit(self, e):         self.close()   if __name__ == '__main__':     app = wx.app()     guicontrol(none, -1, title='control ui test')     app.mainloop() 

the easiest thing in case give frame sizer, add main panel it, , call frame's fit method. example, can replace call self.setsize in guicontrol.__init__ this:

    framesizer = wx.boxsizer()     framesizer.add(panel, 1, wx.expand)     self.setsizer(framesizer)     self.fit()         

Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -