geekdoc-python-zh/docs/pythonlibrary/wxpython-wrap-widgets-with-...

3.7 KiB
Raw Permalink Blame History

wxPython:用 WrapSizer 包装小部件

原文:https://www.blog.pythonlibrary.org/2014/01/22/wxpython-wrap-widgets-with-wrapsizer/

wxPython 2.9 向世界介绍了一种新型的 sizer它可以在您调整框架大小时自动让小部件“环绕”。这种尺码仪被称为 wx。包装尺寸器。由于某种原因,它相对来说不太为人所知,所以在本文中,我们将花几分钟来讨论如何使用它。

要跟随本教程,您需要安装 wxPython 2.9 或更高版本。一旦你明白了,我们就可以继续了。

使用包装尺寸

wxWrapSizerDemo

wx。WrapSizer 小部件的工作方式与 wx 非常相似。BoxSizer 。要使用它,您需要做的就是实例化它并向它添加小部件。让我们来看一个简单的程序:


import random
import wx
from wx.lib.buttons import GenButton

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        sizer = wx.WrapSizer()
        for letter in text:
            btn = GenButton(self, label=letter)
            r = random.randint(128, 255)
            g = random.randint(128, 255)
            b = random.randint(128, 255)
            btn.SetBackgroundColour(wx.Colour(r,g,b))
            btn.Refresh()
            sizer.Add(btn, 0, wx.ALL, 5)

        self.SetSizer(sizer)

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="WrapSizers", size=(400,500))
        panel = MyPanel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

这里我们创建一个 sizer 的实例,然后遍历字母表中的字母,为每个字母创建一个按钮。我们还改变了每个按钮的背景颜色,增加了一点变化。如果您还没有猜到,这个例子是基于 wxPython 演示例子的。您会注意到,当您调整框架大小时,按钮会尽可能地重新排列。有时,它们甚至会改变一点大小。让我们了解更多关于这个 sizer 的信息!

wx。WrapSizer 可以被告知它的方向,您可以在实例化时向它传递标志。方向标志是 wx。水平和 wx.VERTICAL。默认为水平。根据文档“flags 参数可以是值 EXTEND_LAST_ON_EACH_LINE 和 REMOVE_LEADING_SPACES 的组合EXTEND _ LAST _ ON _ EACH _ LINE 将导致每一行的最后一项使用该行的任何剩余空间REMOVE _ LEADING _ SPACES 将从行的开头删除任何间隔元素。”除了普通的 wx 之外WrapSizer 还有四个附加方法。Sizer 方法: CalcMin (计算最小尺寸)、 InformFirstDirection (似乎不被使用)、 IsSpaceItem (可用于将一些普通项目作为间隔符处理)和recalcasesizes(实现计算一个 box sizer 的尺寸,然后设置其子元素的尺寸)。

这就包含了这个小部件的所有信息。希望您能在自己的项目中发现这个相对未知的 sizer 的许多好用途。

注意:这段代码是在 Windows 7 上使用 wxPython 2.9.3 (classic)和 Python 2.7.3 测试的。