【发布时间】:2012-09-18 10:00:54
【问题描述】:
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()
我对@987654331@ 没意见,但我不喜欢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()
这是执行此操作的首选方式吗?
如果稍后添加小部件,即使是直接在Frame 上使用Sizer 的第一种方法,如果没有干预也无法正确处理,所以我认为这是一个完全不同的问题。
【问题讨论】:
-
如果你使用 wxpython >=3,
wx.Frame.SetMinSize是首选。