wxpython 2.8.11.0,python 2.7
如果我将一些Sizer
与某些控件直接放入Frame
之类的
import wx
app=wx.App()
frm = wx.Frame(None, title='title')
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(frm))
sizer.Add(wx.SpinCtrl(frm))
frm.SetSizerAndFit(sizer)
frm.Show()
app.MainLoop()
Frame
将自动拥有正确的最小尺寸以包含Sizer
,并且无法将其缩小。
如果中间有Panel
(根据控件之间的标签需要),这不起作用,窗口可能会太小。
import wx
app=wx.App()
frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))
pan.SetSizerAndFit(sizer)
frm.Show()
app.MainLoop()
此外,frm.Fit()
和frm.SetMinSize(frm.GetEffectiveMinSize())
需要获得相同的行为。完整代码:
import wx
app=wx.App()
frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))
pan.SetSizerAndFit(sizer)
frm.Fit()
frm.SetMinSize(frm.GetEffectiveMinSize())
frm.Show()
app.MainLoop()
我对frm.Fit()
没问题,但我不喜欢frm.SetMinSize(frm.GetEffectiveMinSize())
。是否有更好的解决方案,以便Frame
自动考虑Panel
的最小尺寸,就像之前的Sizer
一样?如果将EffectiveMinSize
在另一个控件之后的更改添加到sizer中,我会考虑会发生什么。
修改 显然
panel.SetSizerAndFit(sizer)
frm.Fit()
frm.SetMinSize(frm.GetEffectiveMinSize())
应替换为
panel.SetSizer(sizer)
sizer.SetSizeHints(frm)
看起来有点干净。总的来说这看起来像
import wx
app=wx.App()
frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))
pan.SetSizer(sizer)
sizer.SetSizeHints(frm)
frm.Show()
app.MainLoop()
这是首选方法吗?
如果稍后添加小部件,即使第一种方法直接在Sizer
上使用Frame
也没有干预,所以我认为这是一个完全不同的问题。
答案 0 :(得分:3)
最优雅的方式(恕我直言)在phineas的回答中给出。有一个额外的,否则不需要的sizer是有点低效,但我不认为它真的很明显。
有些人会像你上一个例子那样手动调用SetSizeHints()
,这也很有效,而且可能更清楚(每当我使用额外的sizer时,我觉得需要发表评论解释为什么它应该'被删除)。
不幸的是没有更好的方法,我不确定我们是否可以添加一个,因为你需要对所有面板,sizer和框架做一些事情,这意味着你不能用一个单独做方法调用而不传递不相关的参数。即我们可以有像
这样的东西panel.SetSizerAndFitParent(sizer, frame);
但目前还不清楚这是否会更好。
答案 1 :(得分:0)
引入管理帧内容的sizer(例如面板)怎么样?由于你没有包含一个最小的例子,我还没有测试过它。
frameSizer = wx.BoxSizer(wx.VERTICAL)
frameSizer.Add(panel)
frm.SetSizerAndFit(frameSizer)