Python BoxSizer问题:无法扩展以适应静态文本的内容

Python BoxSizer问题:无法扩展以适应静态文本的内容,python,wxpython,Python,Wxpython,我正在创建一个包含多个子StaticText元素的StaticText元素,这些元素的大小不太正确。我肯定这是BoxSizer的问题,但也许不是?下面是正在发生的事情的屏幕截图: 应改为: Wilco One Sunday Morning (Song For Jane Smiley's Boyfriend) The Whole Love (Deluxe Edition) 正如您可能推断的那样,第二行和第三行(Album)是一个静态文本元素,它正在包装但没有扩展以适应其内容 以下是创建此元素的代

我正在创建一个包含多个子StaticText元素的StaticText元素,这些元素的大小不太正确。我肯定这是BoxSizer的问题,但也许不是?下面是正在发生的事情的屏幕截图:

应改为:

Wilco
One Sunday Morning (Song
For Jane Smiley's Boyfriend)
The Whole Love (Deluxe Edition)
正如您可能推断的那样,第二行和第三行(Album)是一个静态文本元素,它正在包装但没有扩展以适应其内容

以下是创建此元素的代码:

def PlayLabel(self, artist, track, album):
    header_font = wx.Font(26, wx.SWISS, wx.NORMAL, wx.BOLD, False, "Helvetica")
    album_font = wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD, False, "Helvetica")

    # label container
    block = wx.StaticText(self.Sidebar, -1, '')

    block.sizer = wx.BoxSizer(wx.VERTICAL)
    block.SetBackgroundColour('WHITE')

    label_artist = wx.StaticText(block, -1, artist)
    label_artist.SetForegroundColour('BLACK')
    label_artist.SetFont(header_font)

    label_track = wx.StaticText(block, -1, track)
    label_track.SetForegroundColour('BLACK')
    label_track.SetFont(header_font)

    label_album = wx.StaticText(block, -1, album)
    label_album.SetForegroundColour('BLACK')
    label_album.SetFont(album_font)

    block.sizer.AddMany([
        (label_artist, 1, wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT, 5),
        (label_track, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5),
        (label_album, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, 5)
    ])
    block.SetSizerAndFit(block.sizer)

    self.Sidebar.sizer.Add(block, 0, wx.EXPAND|wx.ALIGN_LEFT|wx.BOTTOM, 5)
    self.Sidebar.sizer.Layout()
    self.Layout()
    return block
知道发生了什么吗

编辑:


完整的代码:

我从未见过有人创建这样的尺寸。通常您会这样做:

mySizer = wx.BoxSizer(wx.VERTICAL)
然后添加每个元素。我怀疑,既然你以一种奇怪的方式做这件事,你就会得到奇怪的结果。不要为此使用StaticText的sizer方法。它们不是容器对象。相反,请执行以下操作:

block = wx.BoxSizer(wx.VERTICAL)
然后像以前一样添加其他小部件。告诉sizer设置自身也不会正常工作:“block.SetSizerAndFit(block.sizer)”。您需要调用父窗口小部件的SetSizer()方法,这可能是此处的侧栏:

self.Sidebar.SetSizer(block)
或者,你也可以像这里那样添加:

self.Sidebar.sizer.Add(block, 0, wx.EXPAND|wx.ALIGN_LEFT|wx.BOTTOM, 5)
编辑

下面是一个简单的代码示例:

import wx

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

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Test")

        self.panel = wx.Panel(self)
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        samples = [("Red", "Breathe Into Me", "End of Silence"),
                   ("eleventyseven", "Lonely", "Sugarfist"),
                   ("Lecrae", "Go Hard", "Rebel")]
        for sample in samples:
            artist, track, album = sample
            self.PlayLabel(artist, track, album)

        self.panel.SetSizer(self.mainSizer)
        panelSizer = wx.BoxSizer()
        panelSizer.Add(self.panel, 1, wx.EXPAND)
        self.SetSizer(panelSizer)
        self.Fit()


    def PlayLabel(self, artist, track, album):
        header_font = wx.Font(26, wx.SWISS, wx.NORMAL, wx.BOLD, False, "Helvetica")
        album_font = wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD, False, "Helvetica")

        block = self.panel

        # sizer
        sizer = self.mainSizer

        # artist
        label_artist = wx.StaticText(block, -1, artist)
        label_artist.SetForegroundColour('BLACK')
        label_artist.SetFont(header_font)

        # track
        label_track = wx.StaticText(block, -1, track)
        label_track.SetForegroundColour('BLACK')
        label_track.SetFont(header_font)

        # album
        label_album = wx.StaticText(block, -1, album)
        label_album.SetForegroundColour('BLACK')
        label_album.SetFont(album_font)

        sizer.AddMany([
                (label_artist, 1, wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT, 5),
                (label_track, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5),
                (label_album, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
        ])

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

我个人不太喜欢Fit(),但在这种情况下,它对我很有效。

这听起来像是一个非常异端的尺码器建议将其改为正统的尺码器?也许我误解了BoxSizer(很多人都这么认为)。是否需要为每个具有子元素的元素创建新的BoxSizer?下面是完整的代码,以防它有所帮助:我发现绘制GUI有帮助。然后,在小部件周围绘制框,以决定需要哪些尺寸。如果要垂直堆叠两个或多个小部件,请使用BoxSizer固定它们。你需要一个尺码来装它们。应该有子元素的3个主要小部件是面板、框架和对话框。尺码器是用来帮助组织孩子们的。谢谢你的提示。我相信我正确地遵循了你的建议,但它仍然没有扩展包装:有趣的StaticText小部件。那么,在根级别创建并在整个过程中使用尺寸标注器通常是最佳做法吗?不是这样。我之所以这么做,是因为您每次都在创建一个面板和一个测码器,在本例中不需要这样做。面板几乎总是可以容纳所有的小部件,但是您可能需要嵌套大小调整器。有几种方法可以解决这个问题。