繁体   English   中英

设置最小窗口大小,以便所有大小调整器都适合

[英]Set a minimal window size so all sizers fit

我试图了解尺寸调整器和尺寸器的工作原理,但是显然,我缺少一些重要的东西。 这是我得到的:

坏

显然,内部面板(大小调整器)不适合窗口。 我想要的是:

好

这是通过手动调整大小创建的。

我该如何实现?

请注意,实际代码具有更多不同的wx.StaticBox因此,对我做错事情的一般性解释将不仅仅是一个修复,而且会受到欢迎。

这是玩具示例代码:

import wx
import wx.lib.agw.floatspin as 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>")
        for 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()

在这种情况下,最简单的方法是给框架一个缩放器,在其中添加主面板,然后调用框架的Fit方法。 例如,您可以替换调用self.SetSizeGUIControl.__init__这一点:

    frameSizer = wx.BoxSizer()
    frameSizer.Add(panel, 1, wx.EXPAND)
    self.SetSizer(frameSizer)
    self.Fit()        

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM