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

Python 3.x 设置最小窗口大小,以便所有大小调整器都适合,python-3.x,wxpython,Python 3.x,Wxpython,我试着去理解,但很清楚,我错过了一些重要的东西。这就是我得到的: 很明显,内面板(施胶器)不适合窗户。我想要的是: 这是通过手动重新调整大小创建的 我怎样才能做到这一点 请注意,真正的代码与wx.StaticBox有很多不同之处,因此,对我的错误进行一般性解释比修复更受欢迎 以下是玩具示例代码: import wx import wx.lib.agw.floatspin as FS class GUIControl(wx.Frame): def __init__(self, p

我试着去理解,但很清楚,我错过了一些重要的东西。这就是我得到的:

很明显,内面板(施胶器)不适合窗户。我想要的是:

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

我怎样才能做到这一点

请注意,真正的代码与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()
导入wx
将wx.lib.agw.floatspin作为FS导入
类GUIControl(wx.Frame):
定义初始化(自我、父、id、标题、*args、**kwargs):
super(GUIControl,self)。\uuuuu init\uuuuuuuu(父项、id、标题、*args、**kwargs)
self.radio={}
self.modes=[‘开环’、‘电流控制’、‘电压控制’]
面板=wx.面板(自)
面板.立根底色(“#5968c3”)
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self._ui(面板),1,wx.EXPAND | wx.ALL,3)
面板设置器(施胶器)
打印(sizer.ComputeFittingWindowsSize(自身))
self.SetSize(sizer.ComputeFittingWindowSize(self))
自我中心()
自我展示(真实)
定义界面(自身、父级):
panel=wx.panel(父级)
vbox=wx.BoxSizer(wx.VERTICAL)
标志=wx.EXPAND | wx.SHAPED
vbox.Add(self.\u ui\u前缀(面板),flag=wx.EXPAND)
vbox.Add(self.\u ui\u control\u mode(面板),flag=flags)
vbox.Add(self.\u ui\u后缀(面板),flag=wx.EXPAND)
面板设置器(vbox)
返回面板
def_ui_前缀(self,parent):
panel=wx.panel(父级)
面板.立根底色(“钢蓝色”)
hbox=wx.BoxSizer(wx.水平)
_label=wx.StaticText(面板,label='')
_label.SetLabelMarkup(“控件”)
hbox.Add(_标签,标志=wx.ALIGN_中心| wx.ALL)
面板设置器(hbox)
返回面板
def_ui_控制_模式(自身、父级):
box=wx.StaticBox(父级,-1,“控制模式”)
_label_modes=wx.StaticText(框,label='')
_标签\模式。设置标签标记(“模式”)
对于处于self.modes模式的项目:
self.radio[项目]=wx.RadioButton(框-1,项目)
_label_duty=wx.StaticText(框,label='')
_标签\占空比。设置标签标记(“占空比”)
self.sc1=wx.SpinCtrl(框,wx.ID_ANY,'0',min=0,max=100)
_单位\占空比=wx.StaticText(框,标签='%”)
_label_current=wx.StaticText(框,label='')
_标签\当前。设置标签标记(“当前”)
self.sc2=FS.FloatSpin(框,
wx.ID_任何,
值=0.0,
最小值=0.0,
最大值=20.0,#修正值
增量=0.1)
self.sc2.SetFormat(“%f”)
self.sc2.SetDigits(1)
_单位\u current=wx.StaticText(框,标签='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,标志)
fgs.AddStretchSpacer()
fgs.AddStretchSpacer()
fgs.Add(self.radio['Current control'],0,标志)
fgs.AddStretchSpacer()
fgs.AddStretchSpacer()
fgs.Add(self.radio['Voltage control'],0,标志)
fgs.AddStretchSpacer()
fgs.Add(_label_duty,0,flags)
fgs.Add(self.sc1、0、标志)
fgs.添加(_单位_职责,0,标志)
fgs.Add(_label_current,0,flags)
fgs.Add(self.sc2,0,标志)
fgs.Add(_单位_当前,0,标志)
fgs.SetSizeHints(框)
fgs.Layout()
盒子.固定器(fgs)
返回框
def_ui_后缀(self,parent):
panel=wx.panel(父级)
面板.立根底色(“钢蓝色”)
hbox=wx.BoxSizer(wx.水平)
hbox.Add(wx.BoxSizer(wx.VERTICAL)),
flag=wx.保留空间(如果隐藏,则为偶数)
_退出=wx.按钮(面板,-1,label=“退出”)
_退出。挫折背景色(“#5968c3”)
_quit.Bind(wx.EVT_按钮,self.OnQuit)
hbox.AddStretchSpacer()
hbox.Add(_quit,flag=wx.ALIGN_CENTER | wx.SHAPED | wx.ALL,border=3)
hbox.AddStretchSpacer()
面板设置器(hbox)
返回面板
def OnQuit(自我,e):
self.Close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=wx.app()
GUIControl(无,-1,title='Control UI test')
app.MainLoop()

在这种情况下,最简单的方法是给框架加上一个大小调整器,添加主面板,然后调用框架的
Fit
方法。例如,您可以将
GUIControl.\uuuu init\uuu
中对
self.SetSize
的调用替换为以下内容:

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

在这种情况下,最简单的方法是给框架一个大小调整器,将主面板添加到其中,然后调用框架的
Fit
方法。例如,您可以将
GUIControl.\uuuu init\uuu
中对
self.SetSize
的调用替换为以下内容:

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

嗯,我试过了,但我还是有同样的行为…☹还有什么想法吗?嗯,我试过了,但我还是有同样的行为…☹还有什么想法吗?