wxPython最小尺寸的Frame with Panel

时间:2012-09-26 17:46:33

标签: python wxpython wxwidgets

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也没有干预,所以我认为这是一个完全不同的问题。

2 个答案:

答案 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)