wxPython SetMinSize 似乎明确设置大小,不允许 window 在需要时增长

wxPython SetMinSize seems to set size explicitly, not allows window to grow when needed

考虑下面的代码。我创建了一个 StaticText 并在其上设置了最小尺寸。但是,StaticText 始终将此大小作为实际大小。尽管文字不合适。我是不是做错了什么?

我想使用此功能创建键值显示,并正确对齐值,并且仅在需要时扩展 key 部分:

a key       - the value
another key - another value
a big key which does not fit - this value
the key     - the value
import wx


class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer()

        static_text = wx.StaticText(
            parent=self, label="a long label exceeding min size."
        )
        static_text.SetMinSize(wx.Size(50, -1))

        sizer.Add(static_text)
        self.SetSizer(sizer)


if __name__ == "__main__":
    app = wx.App()
    frm = wx.Frame(None, title="Test MinSize")
    pnl = TestPanel(frm)
    frm.Show()
    app.MainLoop()

这可能不是您想要听到的,但就在这里。

sizer 在程序员显示数据的愿望和数据的可变性质之间跳起了舞蹈。此外,它还必须应对我们称为 user 的讨厌的外部事物,它有调整 windows.

大小的习惯

SetMinSize 是给 sizer 的指令,如果您愿意,可以提示它应该尝试自动执行的操作。大多数控件还将最小大小设置为控件构造函数中给定的大小,如 best guess.

可以使用该控件的 sizer 条目的 proportionflag 值覆盖或调整这些指令。 请始终记住,同一 sizer 中的其他控件也会受到影响,这可能会在呈现时产生不良结果。

如果我们为 sizer 提供该控件的 wx.EXPAND 标志,它将显示整个小部件,同时保持 MinSize。在这种情况下,将其垂直展开。

如果我们将 sizer 的比例设置为 1,相对于共享该 sizer 的其他控件,它将在 sizer 的方向上尽可能多地拉伸它。

为了理解发生了什么,最好使用这样的代码,更改 MinSizeproportionflags,测试每个更改,直到 sizer 的巫术变成稍微不那么晦涩。

注意:此外,还要测试调整 window 的大小,以查看每种情况下会发生什么。

附加测试说明:

  • 使用超过 1 个控件或小部件测试 sizer
  • 分配颜色以突出显示不总是显而易见的内容。
import wx

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.HORIZONTAL)

        static_text = wx.StaticText(
            parent=self, label="a long label exceeding min size.")
        static_text2 = wx.StaticText(self, label="another label")
        static_text.SetBackgroundColour('green')
        static_text.SetMinSize(wx.Size(50, -1))

        sizer.Add(static_text, proportion=1, flag=wx.ALL, border=0)
        sizer.Add(static_text2, 0, wx.EXPAND, 0)
        self.SetSizer(sizer)


if __name__ == "__main__":
    app = wx.App()
    frm = wx.Frame(None, title="Test MinSize", size=(300,100))
    pnl = TestPanel(frm)
    frm.Show()
    app.MainLoop()

以上代码的示例: