Рубрики
Без рубрики

Учебник Sxpython Sizers: Использование Greadbagsizer

Получите практические, реальные навыки Python на наших ресурсах и пути

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