python 3.x - Set a minimal window size so all sizers fit -
i have tried understand how sizer , sizes work clearly, missing vital. get:
clearly, inside panels (sizers) not fit window. want this:
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
Post a Comment