面板中的填充和 wxpython 中的静态文本换行

Xua*_* Hu 1 python layout user-interface wxwidgets wxpython

我想要一个像这样的布局

在此输入图像描述

框架内部有一个主面板,左侧和右侧有空白填充,另一个子面板位于中间。位于子面板顶部的静态文本元素,更改窗口大小时应正确换行。

我的代码片段如下所示

import wx

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

        self.hsizer = wx.BoxSizer()
        self.hsizer.AddStretchSpacer()

        self.panel = wx.Panel(self)
        self.panel.SetSize((350, -1))

        self.vsizer = wx.BoxSizer(wx.VERTICAL)

        label = (
            "This is a long scentence that I want it wrapped properly, "
            "but it doesn't seem to work at work. "
            "I prefer if you guys can give any sugeestions or help. "
            "For Long Long Long Long Long scentence."
        )
        style = wx.ALIGN_LEFT
        self.static_text = wx.StaticText(self, label=label, style=style)
        self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
        self.static_text.Wrap(self.panel.Size[0])
        self.static_text.SetAutoLayout(True)

        self.panel.SetSizer(self.vsizer)
        self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
        self.hsizer.AddStretchSpacer()
        self.SetSizer(self.hsizer)
        self.Layout()
        print self.Size
        print self.panel.Size

if __name__ == '__main__':
    app = wx.App()
    frame = wx.Frame(None)
    sizer = wx.BoxSizer()
    sizer.Add(MyPanel(frame), flag=wx.EXPAND)
    frame.SetSizer(sizer)
    frame.Show()
    app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

目前,不仅子面板不位于中间,而且静态文本中的文本在更改窗口大小时也无法正确换行。有什么建议让它发挥作用吗?

Rob*_*unn 6

在尝试使用大小调整器实现布局时设置一些背景颜色通常很有帮助,这样可以轻松地可视化边界在哪里,以及在调整大小时它们的行为方式。另一个有用的工具是小部件检查工具。例如:

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        super(MyPanel, self).__init__(parent)
        self.SetBackgroundColour('pink')

        self.hsizer = wx.BoxSizer()
        self.hsizer.AddStretchSpacer()

        self.panel = wx.Panel(self)
        self.panel.SetSize((350, -1))
        self.panel.SetBackgroundColour('green')

        self.vsizer = wx.BoxSizer(wx.VERTICAL)

        label = (
            "This is a long scentence that I want it wrapped properly, "
            "but it doesn't seem to work at work. "
            "I prefer if you guys can give any sugeestions or help. "
            "For Long Long Long Long Long scentence."
        )
        style = wx.ALIGN_LEFT
        self.static_text = wx.StaticText(self, label=label, style=style)
        self.static_text.SetBackgroundColour('yellow')

        self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
        self.static_text.Wrap(self.panel.Size[0])
        self.static_text.SetAutoLayout(True)

        self.panel.SetSizer(self.vsizer)
        self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
        self.hsizer.AddStretchSpacer()
        self.SetSizer(self.hsizer)

if __name__ == '__main__':
    app = wx.App()
    frame = wx.Frame(None)
    frame.SetBackgroundColour('sky blue')
    sizer = wx.BoxSizer()
    sizer.Add(MyPanel(frame), flag=wx.EXPAND)
    frame.SetSizer(sizer)
    frame.Show()

    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()

    app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

运行后,我们可以看到事情与您的布局草图并不真正匹配,当调整框架大小时,文本等内容不会改变大小或位置,并且 MyPanel(粉红色的)也没有调整大小来填充框架。另外,从代码中可以看出,您希望文本成为绿色面板 (self.panel) 的子项,但在运行时查看颜色,显然不是。再次查看代码,我们发现它是使用 self 作为父级而不是 self.panel 创建的。

因此,经过一些调整来解决这些问题后,我们最终得到了以下代码:

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        super(MyPanel, self).__init__(parent)
        self.SetBackgroundColour('pink')

        self.hsizer = wx.BoxSizer()
        self.hsizer.AddStretchSpacer()

        self.panel = wx.Panel(self)
        self.panel.SetSize((350, -1))
        self.panel.SetBackgroundColour('green')

        self.vsizer = wx.BoxSizer(wx.VERTICAL)

        label = (
            "This is a long scentence that I want it wrapped properly, "
            "but it doesn't seem to work at work. "
            "I prefer if you guys can give any sugeestions or help. "
            "For Long Long Long Long Long scentence."
        )
        style = wx.ALIGN_LEFT
        self.static_text = wx.StaticText(self.panel, label=label, style=style)
        self.static_text.SetBackgroundColour('yellow')

        self.vsizer.Add(self.static_text,
                        flag=wx.EXPAND | wx.ALL | wx.ALIGN_TOP, border=5)
        self.static_text.Wrap(self.panel.Size[0])

        self.panel.SetSizer(self.vsizer)
        self.hsizer.Add(self.panel, 1, flag=wx.EXPAND)
        self.hsizer.AddStretchSpacer()
        self.SetSizer(self.hsizer)

if __name__ == '__main__':
    app = wx.App()
    frame = wx.Frame(None)
    frame.SetBackgroundColour('sky blue')
    sizer = wx.BoxSizer()
    sizer.Add(MyPanel(frame), 1, flag=wx.EXPAND)
    frame.SetSizer(sizer)
    frame.Show()

    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()

    app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

最后,如果您希望在大小小于 350 时重新换行文本,那么您需要执行诸如捕获 EVT_SIZE 事件之类的操作,并在需要时以不同的大小再次调用 Wrap 。