4

wxpython 2.8.11.0,python 2.7

如果我把一些Sizer带有一些控件的东西直接放入一个Framelike

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的最小尺寸吗?我正在考虑如果在将另一个控件添加到 sizer 之后发生的更改会发生什么。PanelSizerEffectiveMinSize

编辑: 显然

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没有干预的情况下也无法正确处理,所以我认为这是一个完全不同的问题。

4

2 回答 2

4

飞哥的回答中给出了最优雅的方式(恕我直言)。拥有一个额外的其他不需要的 sizer 效率略低,但我认为它不会真正引人注目。

有些人确实SetSizeHints()手动调用,就像在你的上一个示例中一样,这也有效并且可能更清楚(每当我使用额外的尺寸器时,我觉得有必要留下评论来解释为什么不应该删除它)。

不幸的是,没有更好的方法,我不确定我们是否可以添加一个,因为您需要对所有面板、sizer 和框架做一些事情,这意味着您无法使用单个方法调用来做到这一点将不相关的参数传递给它。即我们可以有类似的东西

panel.SetSizerAndFitParent(sizer, frame);

但目前还不清楚这是否会更好。

于 2012-09-26T23:24:14.683 回答
1

引入管理框架内容(例如面板)的sizer 怎么样?由于您没有包含最小示例,因此我尚未对其进行测试。

frameSizer = wx.BoxSizer(wx.VERTICAL)
frameSizer.Add(panel)
frm.SetSizerAndFit(frameSizer)
于 2012-09-26T19:36:53.970 回答