Вложение сайзеров в блок с использованием wxPython

Я хочу сделать горизонтальные ряды меток и текстовых полей и поместить строки в поле с меткой, чтобы они были хорошо сгруппированы. Однако по какой-то причине рамка распространяется только вокруг последней строки в серии (см. Изображение ниже). Я бы хотел, чтобы она сгруппировала все строки.

Есть ли более простой способ сделать такой сгруппированный и помеченный интерфейс?

Ошибка с этикеткой коробки

Код для генерации вышеуказанного,

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()

person Daniel Farrell    schedule 01.10.2013    source источник


Ответы (2)


Проблема в том, что вы не хотите вкладывать StaticBoxSizer. Вместо этого просто используйте обычный BoxSizer для ваших rowSizer:

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()

Обратите внимание, что коробка не плотно облегает виджеты. Я не думаю, что это может быть, если это основной размер.

person Mike Driscoll    schedule 01.10.2013
comment
Тонкий момент (для новичка)! Но да, это похоже на проблему. - person Daniel Farrell; 02.10.2013

Вы имеете в виду вот так

импорт 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()
person Yoriz    schedule 01.10.2013