Sizer不按照计划行事......

问题描述:

我正在构建一个GUI,其中包含几个不同的面板,我不想在同一个sizer中:虽然它们显示相关的内容,但它们应该是分开的。我有几个面板,每个面板都有自己的sizer被添加到顶级的sizer中。到现在为止还挺好。但是,我无法弄清楚如何让sizer实际确定面板的尺寸。Sizer不按照计划行事......

我有兴趣了解我不错,不是简单的调试。现在

,看来该行为会视版本和操作系统改变,所以这里是我的:

  • CentOS的7
  • Python 3.6
  • wxPython 4.0.0b1
  • 要添加到并发症中,此代码最终必须在Windows 10上工作。

这是我目前得到:

BAD!

这是我想什么情况发生:

Good

虽然有左侧没有边框和对,尽管已经添加了一个。我怀疑sizer代码搞砸了,因此忽略了边界。

的源代码,如它是:由此

import wx.lib.agw.floatspin as FS 
import wx 


class GUICalibration(wx.Frame): 
    """A calibration GUI for raiju…""" 

    def __init__(self, parent, id, title): 
     super(GUICalibration, self).__init__(parent, id, title) 
     panel = wx.Panel(self) 
     panel.SetBackgroundColour('#5968c3') 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self._ui(panel), 1, wx.EXPAND | wx.ALL, 3) 
     sizer.SetSizeHints(panel) 
     panel.SetSizer(sizer) 
     self.Centre() 
     self.Show(True) 

    def _ui(self, parent): 
     panel = wx.Panel(parent) 
     vbox = wx.BoxSizer(wx.VERTICAL) 
     vbox.Add(self._ui_prefix(panel), flag=wx.EXPAND) 
     vbox.Add(self._ui_input(panel), wx.EXPAND) 
     vbox.AddStretchSpacer() 
     vbox.Add(self._ui_suffix(panel), flag=wx.EXPAND) 
     vbox.SetSizeHints(parent) 
     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>Calibration</big></i></b>") 
     hbox.Add(_label, flag=wx.ALIGN_CENTER | wx.ALL) 
     panel.SetSizer(hbox) 
     return panel 

    def _ui_input(self, parent): 
     box = wx.StaticBox(parent, -1, "Calibration input") 
     fgs = wx.FlexGridSizer(3, 3, 11, 11) 
     flags = wx.EXPAND | wx.ALL 

     _spin_count = wx.SpinCtrl(
      box, wx.ID_ANY, '0', min=0, max=1000, size=(128, -1)) 
     _spin_value = FS.FloatSpin(
      box, 
      wx.ID_ANY, 
      size=(128, -1), 
      value=0.0, 
      min_val=-40.0, 
      max_val=100.0, # FIXME 
      increment=0.1) 
     _spin_value.SetFormat("%f") 
     _spin_value.SetDigits(1) 
     _add = wx.Button(box, wx.ID_ANY, "Add calibration data") 

     fgs.Add(wx.StaticText(box, label='Count'), 0, flags) 
     fgs.Add(wx.StaticText(box, label='Value'), 0, flags) 
     fgs.AddStretchSpacer() 

     fgs.Add(_spin_count, 0, flags) 
     fgs.Add(_spin_value, 0, flags) 
     fgs.Add(_add, 0, flags) 

     fgs.SetSizeHints(box) 
     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, wx.ID_ANY, "Quit") 
     _quit.SetBackgroundColour('#5968c3') 
     self.Bind(wx.EVT_BUTTON, self.OnQuit, _quit) 
     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__': 
    """This is useful for testing the frame…""" 
    app = wx.App() 
    GUICalibration(None, -1, title='Calibration') 
    app.MainLoop() 
+1

令人担忧的是,似乎行为可以wxPython的经典和凤凰之间和操作系统之间的差异。为了清楚起见,你应该说明你在问题中使用了什么。我已经申请了一个wxpython-phoenix标签,如果它被批准,它应该有助于清除一些问题。 –

+0

@RolfofSaxony Urgh。这不太好。我编辑了这个问题。 – Sardathrion

甲通行溶液读取:

class GUICalibration(wx.Frame): 

    def __init__(self, parent, id, title): 
     self._logger = logging.getLogger(self.__class__.__name__) 
     super(GUICalibration, self).__init__(parent, id, title) 
     self._ui(self) 
     self.Fit() 
     self.SetAutoLayout(True) 
     self.Centre() 
     self.Show() 

    def _ui(self, parent): 
     panel = wx.Panel(self) 
     sizer = wx.FlexGridSizer(1, 5, 5) 
     sizer.Add(self._ui_frame(panel), 1, wx.EXPAND | wx.ALL, 3) 
     sizer.Add(self._ui_frame(panel), 1, wx.EXPAND | wx.ALL, 3) 
     sizer.Add(self._ui_frame(panel), 1, wx.EXPAND | wx.ALL, 3) 
     panel.SetSizerAndFit(sizer) 
     return panel 

    def _ui_frame(self, parent): 
     sizer = wx.StaticBoxSizer(wx.VERTICAL, parent, 'test',) 
     sizer.Add(wx.Button(parent, -1, 'A very ' + 20 * 'long ' + 'text'), 0, 0, 0) 
     sizer.Add(wx.Button(parent, -1, 'Small button'), 0, wx.EXPAND | wx.ALL, 20) 
     return sizer 

前缀和后缀代码已被省略,以保持代码较短,但都包括在屏幕截图。

此解决方案的问题有两个方面:首先,重新调整窗口大小并不会调整任何大小调整器:它们保持适合的最小可能大小。其次,我失去了顶级面板的背景颜色。为什么?我没有任何想法。

passable solution