почему мой текст не выравнивается должным образом в wxPython? - PullRequest
6 голосов
/ 25 декабря 2011

Я использую wxPython для создания графического интерфейса и пытаюсь выровнять текст, но он совсем не работает. Я пытаюсь выровнять три разных статических текстовых элемента в трех местах (по правому краю, по центру и по левому краю) на трех отдельных панелях. В результате я получаю то, что все три статических текстовых элемента управления выровнены в верхнем левом углу соответствующих панелей. text not aligned

Это код, который у меня есть:

    self.lastText=wx.StaticText(self.textDisplayPanel1, label=self.lastWords, style=wx.ALIGN_RIGHT)
    self.currentText=wx.StaticText(self.textDisplayPanel2, label=self.currentWords, style=wx.ALIGN_CENTRE)
    self.nextText=wx.StaticText(self.textDisplayPanel3, label=self.nextWords, style=wx.ALIGN_LEFT)

Есть идеи, как это исправить?

Спасибо!

Я использую Mac OSX 10.7.2 с Python 2.7.1 и wxPython 2.8.12.1

Ответы [ 3 ]

13 голосов
/ 25 декабря 2011

Редактировать: Хотя все, что прокомментировано ниже, работает на 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)

enter image description here

Чтобы текст выровнялся на панели так, как вам нужно, вы должны указать StaticText на все доступное пространство:

sizer_2.Add(self.label_1, 1, 0, 0)

enter image description here

Здесь у вас есть соответствующий код:

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()

enter image description here

Обратите внимание, что код длиннее необходимого, чтобы подражать вашему примеру с тремя панелями. Вы получаете тот же самый вид рамы, используя только одну панель. На самом деле это можно упростить, не используя панели и не устанавливая 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()

Эта опция подразумевает комбинацию панелей и размеров, которая создает код, который проще упростить, чем показанный для первого варианта.

0 голосов
/ 12 июня 2019

У меня вчера тоже была такая же проблема, я использую MAC OS X, wxpython 4.0.6. Наконец-то я узнаю, что этот скрипт работает на меня.

И я понимаю, что если вы наконец не установите SetSizer, статический текст не будет выравниваться в центре.

Мой код

0 голосов
/ 25 декабря 2011

Я думаю, что текст не выровнен, потому что размер не установлен.Попробуйте:

t1=wx.StaticText(smth, label="foo", pos=(0,0), size=(200,20), style=wx.ALIGN_RIGHT)
t2=wx.StaticText(smth, label="bar", pos=(0,0), size=(200,20), style=wx.ALIGN_CENTRE)

И он будет выровнен внутри поля 200 * 20.По умолчанию размер «auto», т. Е. (-1, -1), т. Е. Достаточно, чтобы текст был видимым, а выравнивание в этом поле не даст visible эффекта

Однако это не всегда работает .

...