Редактировать: Хотя все, что прокомментировано ниже, работает на Windows, первый вариант не будет работать, например, на Ubuntu из-за, возможно, ошибки. Предыдущий пост, приведенный в комментариях, указывает, что такая же проблема обнаружена в OSX.
В любом случае, второй вариант с использованием вертикальных размеров работает как в Ubuntu, так и в Windows, так что вы можете попробовать его на OSX.
В вашем тексте есть инструкция для выравнивания так, как вы хотите, чтобы wx.ALIGN...
, и фактически он выравнивается. Однако размер StaticText не размер панели, а только размер текста. Ограничив его положение собственным размером, вы не сможете увидеть разницу между режимами выравнивания.
У вас есть два варианта решения проблемы:
Вариант 1. Разверните размер виджета StaticText и разместите на нем свой текст
Вы можете увеличить размер вашего виджета StaticText, используя его параметр size
. Это плохое решение, за исключением родителей фиксированного размера или фреймов, которые вы не собираетесь изменять или повторно использовать в других приложениях. Если размер виджета, содержащего текст, изменится, то относительная позиция текста также будет изменена, поскольку его размер остается фиксированным. Поэтому всегда лучше организовывать свои виджеты с помощью sizer.
Доля доступного пространства, занимаемого виджетом в слоте sizer, задается вторым параметром в sizer.Add()
(0
- минимальный размер, 1
- полное занятие):
sizer_2.Add(self.label_1, 0, 0, 0)
Чтобы текст выровнялся на панели так, как вам нужно, вы должны указать StaticText на все доступное пространство:
sizer_2.Add(self.label_1, 1, 0, 0)
Здесь у вас есть соответствующий код:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.label_1 = wx.StaticText(self.panel_1, -1, "label_1", style=wx.ALIGN_RIGHT)
self.panel_2 = wx.Panel(self, -1)
self.label_2 = wx.StaticText(self.panel_2, -1, "label_2", style=wx.ALIGN_CENTRE)
self.panel_3 = wx.Panel(self, -1)
self.label_3 = wx.StaticText(self.panel_3, -1, "label_3")
self.panel_1.SetBackgroundColour(wx.Colour(0, 255, 0))
self.panel_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2.Add(self.label_1, 1, 0, 0)
sizer_3.Add(self.label_2, 1, 0, 0)
sizer_4.Add(self.label_3, 1, 0, 0)
self.panel_1.SetSizer(sizer_2)
self.panel_2.SetSizer(sizer_3)
self.panel_3.SetSizer(sizer_4)
sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Обратите внимание, что код длиннее необходимого, чтобы подражать вашему примеру с тремя панелями. Вы получаете тот же самый вид рамы, используя только одну панель. На самом деле это можно упростить, не используя панели и не устанавливая StaticText непосредственно в классификаторе:
class MyFrame2(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.label_1 = wx.StaticText(self, -1, "label_1", style=wx.ALIGN_RIGHT)
self.label_2 = wx.StaticText(self, -1, "label_2", style=wx.ALIGN_CENTRE)
self.label_3 = wx.StaticText(self, -1, "label_3")
self.label_1.SetBackgroundColour(wx.Colour(127, 255, 0))
self.label_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.label_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.label_1, 1, wx.EXPAND, 0)
sizer.Add(self.label_2, 1, wx.EXPAND, 0)
sizer.Add(self.label_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer)
sizer.Fit(self)
self.Layout()
Вариант 2. Расположите сам виджет в нужном месте на доступном пространстве классификатора.
Для этой цели вы можете использовать параметр position
, равный StaticText
. Но это будет иметь те же проблемы, указанные выше для использования size
. Итак, снова вы хотите контролировать геометрию ваших видов с помощью размеров.
Вы размещаете виджет в сортировщике, используя один из:
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
или
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
По какой-то причине, чтобы это работало, вам нужна вертикальная BoxSizer
(и точно так же, если вы хотите использовать wx.ALIGN_CENTER_VERTICAL, вам понадобится горизонтальная BoxSizer
:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_4 = wx.Panel(self, -1)
self.label_5 = wx.StaticText(self.panel_4, -1, "label_5")
self.panel_5 = wx.Panel(self, -1)
self.label_6 = wx.StaticText(self.panel_5, -1, "label_6")
self.panel_6 = wx.Panel(self, -1)
self.label_7 = wx.StaticText(self.panel_6, -1, "label_7")
self.panel_4.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_5.SetBackgroundColour(wx.Colour(127, 255, 0))
self.panel_6.SetBackgroundColour(wx.Colour(219, 112, 219))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_8 = wx.BoxSizer(wx.VERTICAL)
sizer_7 = wx.BoxSizer(wx.VERTICAL)
sizer_6 = wx.BoxSizer(wx.VERTICAL)
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_8.Add(self.label_7, 0, 0, 0)
self.panel_4.SetSizer(sizer_6)
self.panel_5.SetSizer(sizer_7)
self.panel_6.SetSizer(sizer_8)
sizer_1.Add(self.panel_4, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_5, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_6, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Эта опция подразумевает комбинацию панелей и размеров, которая создает код, который проще упростить, чем показанный для первого варианта.