首页 > 解决方案 > wxPython SetMinSize 似乎明确设置大小,不允许窗口在需要时增长

问题描述

考虑下面的代码。我创建了一个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()

标签: pythonwxpython

解决方案


这可能不是你想听到的,但这里有。

sizer 在程序员希望显示数据和该数据的可变性质之间进行舞蹈。此外,它还必须应对我们称为 的讨厌的外部事物user,它有调整窗口大小的习惯。

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

proportion可以使用该控件的 sizer 条目的和flag值覆盖或调整这些指令。请始终牢记,同一 sizer 中的其他控件将受到影响,这可能会在演示时产生不良结果。

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

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

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

注意:此外,还可以测试重新调整窗口大小,以查看每种情况下会发生什么。

附加测试说明:

  • 使用超过 1 个控件或小部件测试大小调整器
  • 分配颜色以突出显示并不总是显而易见的内容。
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()

上述代码的示例:
在此处输入图像描述 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述


推荐阅读