Уже многие годы, я натыкаюсь на вопросы людей о том, как поместить в виджет в центр рамки, панели или диалога. Решение довольно простое. В большинстве случаев, вам нужно просто поместить Horizontal BoxSizer внутрь Vertical BoxSizer с несколькими спейсерами. В данной статье я покажу три разных способа сделать это.
Используя поддельные спейсеры
Когда я впервые узнал о том, как поместить виджет в центр, мне сказали, что я могу использовать кортеж для моего спейсера. Синтаксис выглядит немного странно, но это работает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import wx class MainFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Center the Button") panel = wx.Panel(self) h_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer = wx.BoxSizer(wx.VERTICAL) btn = wx.Button(panel, label="Centered") h_sizer.Add(btn, 0, wx.CENTER) main_sizer.Add((0,0), 1, wx.EXPAND) main_sizer.Add(h_sizer, 0, wx.CENTER) main_sizer.Add((0,0), 1, wx.EXPAND) panel.SetSizer(main_sizer) self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop() |
Здесь мы закрепляем горизонтальный BoxSizer внутри вертикального BoxSizer высшего уровня. Но мы окружаем горизонтальный сайзер двумя “â€oe”spacers, которые являются кортежами, обе пропорции которых заданы как 1, а также установлен флаг стиля wx.EXPAND.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Используя AddStretchSpacer
Сайзеры wxPython содержат метод AddStretchSpacer, который является хорошим удобным методом, делающим в точности то же, что происходило в примере выше. Давайте взглянем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import wx class MainFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Center the Button") panel = wx.Panel(self) h_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer = wx.BoxSizer(wx.VERTICAL) btn = wx.Button(panel, label="Centered") h_sizer.Add(btn, 0, wx.CENTER) main_sizer.AddStretchSpacer(prop=1) main_sizer.Add(h_sizer, 0, wx.CENTER) main_sizer.AddStretchSpacer(prop=1) panel.SetSizer(main_sizer) self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop() |
Вы заметите, что единственным отличием является использование метода AddStretchSpacer параллельно с prop-параметром, значением которого является 1.
Не используя закрепляющиеся сайзеры
Один из проницательных читателей моего блога обнаружил, что существует третий способ поместить виджет в центр, не требующий использования закрепляющихся сайзеров. Давайте взглянем на эту идею:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import wx class MainFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Center the Button") panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) btn = wx.Button(panel, label="Centered") main_sizer.AddStretchSpacer() main_sizer.Add(btn, 0, wx.CENTER) main_sizer.AddStretchSpacer() panel.SetSizer(main_sizer) self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop() |
Здесь мы просто создаём вертикальный сайзер, добавляем натяжной спейсер, а затем приказываем кнопке стать в центр, а затем добавляем ещё один натяжной спейсер. Этот код очень похож на предыдущий пример, за исключением того, что мы совсем не используем горизонтальный сайзер. Особая благодарность Yoriz за то, что он показал мне это.
Итоги
Теперь вы знаете несколько разных способов размещения виджета по центру в вашей wx.Frame или wx.Panel. Вам это очень пригодится в случаях, когда нужно сделать так, чтобы кнопка была размещена внизу окна по центру. Я выяснил, что центрирование виджетов – это довольно популярное явление, которое мне даже пришлось применить в своём приложении, так что иметь несколько разных путей выполнения данной задачи будет очень даже кстати.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»