Автор оригинала: Mike Driscoll.
В этом руководстве я возьму свой код из Учебное пособие на сетку Я написал на днях и сильно изменил его, чтобы отобразить странно форменные виджеты в Greatbagsizer. Greadbagsizer является самым сложным из сизеров. Он подклассы FLEXGRIDSIZER, поэтому вы можете использовать все это методы родителей, а также те, которые добавляют GridBagsizer. Посмотреть Документы Или используйте функциональные возможности Python () для получения дополнительной информации о упомянутых методах.
Вот как вы создали ремень Gridbagsizer:
bagSizer = wx.GridBagSizer(hgap=5, vgap=5)
Вы заметите, что вам не нужно указывать строки или столбцы, когда вы создаете экземпляр GRIDBagsizer. Когда вы попадаете в функцию ADD (), вы заметите, что добавляет параметр SPAN. Этот параметр позволяет указывать, если виджет может указать несколько строк, столбцов или оба. Прежде чем я на самом деле начну это делать, я пойду через нечетные виджеты, которые мы будем добавлять к ряду.
Первый, который я собираюсь добавить, это радиобокс. Во-первых, вам необходимо создать список значений для Radiobox. Вот установка для этого интересного виджета:
rb = wx.RadioBox(parent, id, label, pos, size, choices, majorDimension, style, validator, name)
Вот только два параметра здесь, что я думаю, нужно дополнительное объяснение: выбор и майодомер. Параметр «Выбор» относится к списку значений, которые вы создаете. Параметр Majodimension используется для укажения размера одного измерения, либо строк, либо столбцов, которые основаны на использовании флага стиля (либо wx.ra_specify_cols или wx.ra_specify_rows). Это по умолчанию для столбцов. Если вы хотите противоположный эффект, то используйте флаг wx.ra_specify_rows. См. Книга «WXPYPHON в действии», стр. 215 для получения дополнительной информации.
Другой виджет, который я буду использовать, является многоуровневым TextCtrl. Все, что вам нужно сделать, чтобы сделать TextCtrl GO MULTILINE, добавляет флаг стиля, WX.TE_Multiline. Как только мы сделаем это добавленные, и правильные флаги на месте, вы должны увидеть что-то вроде этого:
ОК. Давайте посмотрим на код:
import wx class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, 'My Form') # Add a panel so it looks the correct on all platforms self.panel = wx.Panel(self, wx.ID_ANY) bmp = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16)) font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD) titleIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp) title = wx.StaticText(self.panel, wx.ID_ANY, 'My Title') title.SetFont(font) # 1st row of widgets bmp = wx.ArtProvider.GetBitmap(wx.ART_TIP, wx.ART_OTHER, (16, 16)) inputOneIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp) labelOne = wx.StaticText(self.panel, wx.ID_ANY, 'Name') inputTxtOne = wx.TextCtrl(self.panel, wx.ID_ANY,'') sampleList = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'] rb = wx.RadioBox( self.panel, wx.ID_ANY, "wx.RadioBox", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS ) # 2nd row of widgets multiTxt = wx.TextCtrl(self.panel, wx.ID_ANY, '', size=(200,100), style=wx.TE_MULTILINE) sampleList = ['one', 'two', 'three', 'four'] combo = wx.ComboBox(self.panel, wx.ID_ANY, 'Default', wx.DefaultPosition, (100,-1), sampleList, wx.CB_DROPDOWN) # Create the sizers topSizer = wx.BoxSizer(wx.VERTICAL) titleSizer = wx.BoxSizer(wx.HORIZONTAL) bagSizer = wx.GridBagSizer(hgap=5, vgap=5) # Add widgets to sizers titleSizer.Add(titleIco, 0, wx.ALL, 5) titleSizer.Add(title, 0, wx.ALL, 5) bagSizer.Add(inputOneIco, pos=(0,0), flag=wx.ALL|wx.ALIGN_CENTER_VERTICAL, border=5) bagSizer.Add(labelOne, pos=(0,1), flag=wx.ALL|wx.ALIGN_CENTER_VERTICAL, border=5) bagSizer.Add(inputTxtOne, pos=(0,2), flag=wx.EXPAND|wx.ALL, border=10) bagSizer.AddGrowableCol(2, 0) bagSizer.Add(rb, pos=(0,3), span=(3,2)) bagSizer.Add(multiTxt, pos=(1,0), flag=wx.ALL, border=5) bagSizer.Add(combo, pos=(1,1), flag=wx.ALL, border=5) # Add sub-sizers to topSizer topSizer.Add(titleSizer, 0, wx.CENTER) topSizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 5) topSizer.Add(bagSizer, 0, wx.ALL|wx.EXPAND, 5) self.panel.SetSizer(topSizer) # SetSizeHints(minW, minH, maxW, maxH) self.SetSizeHints(250,200,700,300) topSizer.Fit(self) # Run the program if __name__ == '__main__': app = wx.PySimpleApp() frame = MyForm().Show() app.MainLoop()
Одна из первых вещей, которые вы заметите, это то, что когда я добавляю свой значок и метку в GridBagsizer, я обязательно пропустил флаг WX.Align_Center_Vertical, чтобы они были сосредоточены с первым управлением текста. Вы также заметите «POS» параметр. Это говорит о Greatbagsizer, где поставить виджет. Таким образом, POS = (0,0) означает поставить виджет в строку 0, столбец 0.
Другие вещи, которые следует отметить:
- Первый текстовый контроль получает границу 10, так что это не «толстый» (слишком высокий)
- Чтобы позволить текстовому элементу для изменения изменения размера, вам необходимо сделать столбец «выращиваемый» с помощью метода AddGrowableCol () GRIDBagsizer.
- Примите к сведению, какие виджеты я дал атрибут охвата. ПОМНИТЕ, SPAN (ROW, COL) начинается везде, к которому он применяется. Таким образом, если виджет находится в (0,0), и вы скажете это, чтобы пролистать (2,0), он будет проходить 2 строк, но ноль столбцов.
Я не использовал все методы Greatbagsizer в этой статье. Я призываю читателю проверить методы SetFLexabledirection () и SetnonFLEXBLEGROWMODE (), поскольку они могут быть полезны для управления, каким направлением строки или колонки растягиваются.
Загрузки Код
Дальше чтение Greatbagsizers на вики ZETCode