【问题标题】:Nesting sizers within a box using wxPython使用 wxPython 在一个盒子内嵌套 sizer
【发布时间】:2013-10-07 04:37:35
【问题描述】:

我希望制作标签和文本字段的水平行,并将这些行放在一个带有标签的框内,以便它们很好地分组。但是,由于某种原因,该框仅围绕系列中的最后一行延伸(见下图),我希望它对所有行进行分组。

有没有更简单的方法来制作像这样的分组和标记界面?

生成上面的代码,

import wx

class ExamplePanel(wx.Panel):

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

        self.mainBox = wx.StaticBox(self, id=-1, label="Box Label")
        self.mainSizer = wx.StaticBoxSizer(self.mainBox, wx.VERTICAL)

        labels = ["A: ", "B: ", "C: "]
        for i, label in enumerate(labels):
            itemLabel = wx.StaticText(self, label=label)
            itemTextCtrl = wx.TextCtrl(self, value="placeholder")
            itemTextCtrl.SetForegroundColour(wx.LIGHT_GREY)
            rowSizer = wx.StaticBoxSizer(self.mainBox, wx.HORIZONTAL)
            rowSizer.Add(itemLabel, 0, wx.ALL, 0)
            rowSizer.Add(itemTextCtrl, 0, wx.ALL, 0)
            self.mainSizer.Add(rowSizer)

        self.SetSizer(self.mainSizer)
        self.mainSizer.Fit(self)

if __name__ == '__main__':
    app = wx.App(False)
    frame = wx.Frame(None)
    panel = ExamplePanel(frame)
    frame.Show()
    app.MainLoop()

【问题讨论】:

    标签: wxpython sizer


    【解决方案1】:

    问题是您不想嵌套 StaticBoxSizer。相反,只需为您的 rowSizer 使用普通的 BoxSizer:

    import wx
    
    class ExamplePanel(wx.Panel):
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
    
            self.mainBox = wx.StaticBox(self, id=-1, label="Box Label")
            self.mainSizer = wx.StaticBoxSizer(self.mainBox, wx.VERTICAL)
    
            labels = ["A: ", "B: ", "C: "]
            for i, label in enumerate(labels):
                itemLabel = wx.StaticText(self, label=label)
                itemTextCtrl = wx.TextCtrl(self, value="placeholder")
                itemTextCtrl.SetForegroundColour(wx.LIGHT_GREY)
                rowSizer = wx.BoxSizer(wx.HORIZONTAL)
                rowSizer.Add(itemLabel, 0, wx.ALL, 0)
                rowSizer.Add(itemTextCtrl, 0, wx.ALL, 0)
                self.mainSizer.Add(rowSizer)
    
            self.SetSizer(self.mainSizer)
            self.mainSizer.Fit(self)
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = wx.Frame(None)
        panel = ExamplePanel(frame)
        frame.Show()
        app.MainLoop()
    

    请注意,小部件周围的盒子并不紧密。如果它是主要的尺寸器,我认为它不可能。

    【讨论】:

    • 一个微妙的点(对于初学者)!但是,是的,这似乎是个问题。
    【解决方案2】:

    你的意思是这样的

    导入 wx

    class ExamplePanel(wx.Panel):
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
    
            self.mainBox = wx.StaticBox(self, label="Box Label")
            self.boxSizer = wx.StaticBoxSizer(self.mainBox, wx.VERTICAL)
    
            labels = ["A: ", "B: ", "C: "]
            for label in labels:
                itemLabel = wx.StaticText(self, label=label)
                itemTextCtrl = wx.TextCtrl(self, value="placeholder")
                itemTextCtrl.SetForegroundColour(wx.LIGHT_GREY)
                rowSizer = wx.BoxSizer(wx.HORIZONTAL)
                rowSizer.Add(itemLabel, 0, wx.ALL, 2)
                rowSizer.Add(itemTextCtrl, 0, wx.ALL, 2)
                self.boxSizer.Add(rowSizer)
    
            pSizer = wx.BoxSizer(wx.VERTICAL)
            pSizer.Add(self.boxSizer, 0, wx.ALL, 7)
            self.SetSizer(pSizer)
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = wx.Frame(None)
        panel = ExamplePanel(frame)
        frame.Show()
        app.MainLoop()
    

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 2011-07-06
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2012-01-24
      相关资源
      最近更新 更多