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

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

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

Автор оригинала: Mike Driscoll.

В моем последнем посте я создал общую форму в Wxpython, используя только WX.BoxSizer для автоматического размера моих виджетов. На этот раз я добавляю к моему предыдущему примеру, используя WX.GRIDSIZER, чтобы показать следующее:

  • Как правильно выровнять значок и ярлык
  • Как вертикально выровнять этикетку с помощью текста управления
  • Как держать текстовые элементы управления выстроились, независимо от того, какова длина меток.

Во-первых, я должен поблагодарить Малкольм из WXPYPHON Группа пользователя Для оспаривания меня с идеями по улучшению моего последнего примера, и мне также нужно поблагодарить Карстен за то, что рассказывал мне один хороший способ выполнить затруднительное положение правильного выравнивания Малкольма. Просто так вы знаете, это не единственный способ сделать это, и может быть лучше или проще. Любой глупый код – моя вина полностью.

Теперь, на шоу! Первый элемент примечания – это WX.Gridsizer, который я использовал. Давайте посмотрим под капотом:

gridSizer = wx.GridSizer(rows=4, cols=2, hgap=5, vgap=5)

Это говорит нам, что я создаю виджет, который будет иметь 4 строки и 2 столбца с вертикальным и горизонтальным зазором белого пространства 5 пикселей. Вы добавляете виджеты к этому справа к левому способу таким, что когда вы добавили ряд виджетов, равных номеру столбца, он автоматически «оборачивает» к следующей строке. Другими словами, если я добавлю два виджета, которые представляют собой одну полную строку и следующий виджет, который я добавил, автоматически переходит на вторую строку (и так далее и пр.).

Прежде чем мы добавим что-либо к WX.Gridsizer, хотя мы должны посмотреть, как я изменил свой WX.Boxsizer. Я добавил проставку в начало каждого wx.boxsizer с долей 1. Это означает, что проставка займет все левое пространство в Sizer. Я также добавляю значок и метку на каждый WX.BoxSizer, а затем добавляю WX.BoxSizer в качестве первого элемента в WX.GRIDSIZER. Но обратно в проставку:

inputOneSizer.Add((20,20), proportion=1)

Spacer – это просто кортеж в этом случае. Вы на самом деле можете использовать практически любой размер. Первый элемент кортежа – ширина, а вторая – высота. Если бы у меня не было, установлена до 1, то я мог бы связываться с размером ширины, чтобы расположить мою значок и метку. Если вы хотите использовать высоту по умолчанию, используйте A -1. Это говорит wxpython использовать по умолчанию.

Вы заметите, что я добавил флаг WX.Align_Center_Vertical, когда добавляю свои метки на WX.BoxSizer. Это заставить ярлык в центре самостоятельно и, таким образом, похоже, что он также сосредоточен относительно элементов управления текстом. В некоторых моих реальных программах я только что сделал размер шрифта больше для эффекта, который вполне похоже.

Теперь мы добавляем WX.Boxsizer на мой wx.gridsizer:

gridSizer.Add(inputOneSizer, 0, wx.ALIGN_RIGHT)

Здесь я установил WX.Align_Right, чтобы сделать все элементы «нажать» на невидимую стенку клетки рядом с управлением текста. Когда я добавляю текстовый элемент управления, я уверен, что пропускаю флаг WX.EXPAND так, чтобы он расширился при изменении окна.

Наконец, добавляю WX.Gridsizer в свой Topsizer, который является вертикальным wx.boxsizer:

topSizer.Add(gridSizer, 0, wx.ALL|wx.EXPAND, 5) 

В этом вы должны обратить внимание, что я говорю, чтобы он также расширился. Если я не сделаю этого, чем топсайзер будет держать сизеры, которые он содержит от расширения. Попробуйте вынуть этот флаг, чтобы увидеть сами.

Вот код в полном объеме:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, title='My Form')
 
        # Add a panel so it looks correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)
 
        bmp = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16))
        titleIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        title = wx.StaticText(self.panel, wx.ID_ANY, 'My Title')

        lblSize = (50, -1)
        
        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,'')
 
        inputTwoIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelTwo = wx.StaticText(self.panel, wx.ID_ANY, 'Address')
        inputTxtTwo = wx.TextCtrl(self.panel, wx.ID_ANY,'')
 
        inputThreeIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelThree = wx.StaticText(self.panel, wx.ID_ANY, 'Email')
        inputTxtThree = wx.TextCtrl(self.panel, wx.ID_ANY, '')
 
        inputFourIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelFour = wx.StaticText(self.panel, wx.ID_ANY, 'Phone')
        inputTxtFour = wx.TextCtrl(self.panel, wx.ID_ANY, '')
 
        okBtn = wx.Button(self.panel, wx.ID_ANY, 'OK')
        cancelBtn = wx.Button(self.panel, wx.ID_ANY, 'Cancel')
        self.Bind(wx.EVT_BUTTON, self.onOK, okBtn)
        self.Bind(wx.EVT_BUTTON, self.onCancel, cancelBtn)
 
        topSizer        = wx.BoxSizer(wx.VERTICAL)
        titleSizer      = wx.BoxSizer(wx.HORIZONTAL)
        gridSizer       = wx.GridSizer(rows=4, cols=2, hgap=5, vgap=5)
        inputOneSizer   = wx.BoxSizer(wx.HORIZONTAL)
        inputTwoSizer   = wx.BoxSizer(wx.HORIZONTAL)
        inputThreeSizer = wx.BoxSizer(wx.HORIZONTAL)
        inputFourSizer  = wx.BoxSizer(wx.HORIZONTAL)
        btnSizer        = wx.BoxSizer(wx.HORIZONTAL)
 
        titleSizer.Add(titleIco, 0, wx.ALL, 5)
        titleSizer.Add(title, 0, wx.ALL, 5)

        # each input sizer will contain 3 items
        # A spacer (proportion=1),
        # A bitmap (proportion=0),
        # and a label (proportion=0)
        inputOneSizer.Add((20,-1), proportion=1)  # this is a spacer
        inputOneSizer.Add(inputOneIco, 0, wx.ALL, 5)
        inputOneSizer.Add(labelOne, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) 

        inputTwoSizer.Add((20,20), 1, wx.EXPAND) # this is a spacer
        inputTwoSizer.Add(inputTwoIco, 0, wx.ALL, 5)
        inputTwoSizer.Add(labelTwo, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5)

        inputThreeSizer.Add((20,20), 1, wx.EXPAND) # this is a spacer
        inputThreeSizer.Add(inputThreeIco, 0, wx.ALL, 5)
        inputThreeSizer.Add(labelThree, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5)
 
        inputFourSizer.Add((20,20), 1, wx.EXPAND) # this is a spacer
        inputFourSizer.Add(inputFourIco, 0, wx.ALL, 5)
        inputFourSizer.Add(labelFour, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5)

        # Add the 3-item sizer to the gridsizer and
        # Right align the labels and icons
        gridSizer.Add(inputOneSizer, 0, wx.ALIGN_RIGHT)
        # Set the TextCtrl to expand on resize
        gridSizer.Add(inputTxtOne, 0, wx.EXPAND)
        gridSizer.Add(inputTwoSizer, 0, wx.ALIGN_RIGHT)
        gridSizer.Add(inputTxtTwo, 0, wx.EXPAND)
        gridSizer.Add(inputThreeSizer, 0, wx.ALIGN_RIGHT)
        gridSizer.Add(inputTxtThree, 0, wx.EXPAND)
        gridSizer.Add(inputFourSizer, 0, wx.ALIGN_RIGHT)
        gridSizer.Add(inputTxtFour, 0, wx.EXPAND)
 
        btnSizer.Add(okBtn, 0, wx.ALL, 5)
        btnSizer.Add(cancelBtn, 0, wx.ALL, 5)
 
        topSizer.Add(titleSizer, 0, wx.CENTER)
        topSizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(gridSizer, 0, wx.ALL|wx.EXPAND, 5)        
        topSizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(btnSizer, 0, wx.ALL|wx.CENTER, 5)

        # SetSizeHints(minW, minH, maxW, maxH)
        self.SetSizeHints(250,300,500,400)
         
        self.panel.SetSizer(topSizer)
        topSizer.Fit(self)        
 
 
    def onOK(self, event):
        # Do something
        print 'onOK handler'
 
    def onCancel(self, event):
        self.closeProgram()
 
    def closeProgram(self):
        self.Close()
 
 
# Run the program
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

Вот и это на сегодня. Наслаждаться!

Загрузки Учебное пособие в WXPYPHON SIZER 2