Автор оригинала: Mike Driscoll.
Есть много виджетов, которые включены в WXPYPHON GUI Toolkit. Один из них – довольно удобный виджет, называемый wx.cstaticbox Отказ Этот виджет принимает строку, а затем нарисует коробку со строкой в верхней левой руке составляющей коробки. Однако это работает только при использовании его в сочетании с wx.cstaticboxsizer Отказ
Вот пример того, что можно выглядеть так:
Теперь давайте пойдем вперед и напишите код, который вы будете использовать, чтобы создать пример выше:
import wx class MyPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) box = wx.StaticBox(self, -1, "This is a wx.StaticBox") bsizer = wx.StaticBoxSizer(box, wx.VERTICAL) t = wx.StaticText(self, -1, "Controls placed \"inside\" the box are really its siblings") bsizer.Add(t, 0, wx.TOP|wx.LEFT, 10) border = wx.BoxSizer() border.Add(bsizer, 1, wx.EXPAND|wx.ALL, 25) self.SetSizer(border) class MyFrame(wx.Frame): def __init__(self): super().__init__(None, title='Test') panel = MyPanel(self) self.Show() if __name__ == '__main__': app = wx.App(False) frame = MyFrame() app.MainLoop()
Этот код основан на wx.cstaticbox Демо-код от WxPython’s Демо-приложение Отказ В основном вы создаете wx.cstaticbox добавьте его в экземпляр wx.cstaticboxsizer а затем добавьте это к WX.Boxsizer и вы сделали.
Но что, если вы хотите более сложный макет в коробке?
Давайте посмотрим на это использование следующее!
Гнездовые сизуры в wx.cstaticboxsizer
Чаще всего нет, вы захотите больше, чем один виджет внутри вашего виджета коробки. Когда это произойдет, вам нужно будет использовать Sizers внутри вашего wx.cstaticboxsizer Отказ
Вот пример:
Давайте пойдем вперед и посмотрите на код для этого примера:
import wx class MyPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) box = wx.StaticBox(self, -1, "Group Name") bsizer = wx.StaticBoxSizer(box, wx.VERTICAL) hsizer = wx.BoxSizer() vsizer = wx.BoxSizer(wx.VERTICAL) lbl = wx.StaticText(self, label='label 1') vsizer.Add(lbl) cbo = wx.ComboBox(self, value='Python', choices=['Python', 'Ruby'], size=(75, -1)) vsizer.Add(cbo) hsizer.Add(vsizer) hsizer.AddSpacer(80) vsizer = wx.BoxSizer(wx.VERTICAL) lbl = wx.StaticText(self, label='label 2') vsizer.Add(lbl) cbo = wx.ComboBox(self, value='Ford', choices=['Ford', 'Chevrolet'], size=(75, -1)) vsizer.Add(cbo) hsizer.Add(vsizer) bsizer.Add(hsizer, 0, wx.CENTER) main_sizer = wx.BoxSizer() main_sizer.Add(bsizer, 1, wx.EXPAND | wx.ALL, 10) self.SetSizer(main_sizer) class MyFrame(wx.Frame): def __init__(self): super().__init__(None, title='Test') panel = MyPanel(self) self.Show() if __name__ == '__main__': app = wx.App(False) frame = MyFrame() app.MainLoop()
В этом случае вам необходимо создать два вертикально ориентированных wx.boxsizer держать четыре виджета в двух столбцах. Вы добавляете эти сизуры на горизонтально ориентированные WX.Boxsizer также. Если вы хотите немного упростить это, вы можете использовать wx.gridsizer вместо этих боксов.
Независимо от подхода, вы в конечном итоге с красивым выложенным приложением.
Обертывание
Используя wx.cstaticbox Виджет довольно прямой прямого. Я думаю, что это может быть проще, если виджет и Sizer были объединены в один класс, хотя. В любом случае, если вы хотите узнать больше об этом виджете, вы должны увидеть Документация Отказ Весело и счастливое кодирование!