Автор оригинала: 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