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