【问题标题】:wxPython minimal size of Frame with a PanelwxPython 最小尺寸的 Frame with a Panel
【发布时间】: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()

我对@9​​87654331@ 没意见,但我不喜欢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 是首选。

标签: python wxpython wxwidgets


【解决方案1】:

飞哥的回答中给出了最优雅的方式(恕我直言)。有一个额外的不需要的尺寸有点低效,但我不认为它真的很明显。

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

不幸的是,没有更好的方法,我不确定我们是否可以添加一个,因为您需要对所有面板、尺寸器和框架做一些事情,这意味着您不能只用一个方法调用而不传递无关的参数给它。 IE。我们可以有类似的东西

panel.SetSizerAndFitParent(sizer, frame);

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

【讨论】:

  • 感谢@VZ 的评论,正如我在其他评论中所说的@phineas 解决方案,额外的Sizer 有效。我发现在两者之间添加另一个对象比对SetSizeHints() 的额外方法调用更不优雅,所以我想我会坚持使用SetSizeHints()
【解决方案2】:

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

frameSizer = wx.BoxSizer(wx.VERTICAL)
frameSizer.Add(panel)
frm.SetSizerAndFit(frameSizer)

【讨论】:

  • 您好@phineas,我在我的问题中添加了最少的示例。我也尝试了你的解决方案,它就像调用SetSizeHints() 一样工作,但我发现有这个额外的Sizer 有点不雅。
  • 努力。没错,如果您要添加多个面板,则额外的大小调整器会更有意义。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2017-10-12
  • 2016-10-27
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多