wxPython - виджеты друг над другом с помощью GridSizer

Я изучаю wxPython и экспериментирую с GridSizer, так как это мой любимый способ работы с макетами. Помимо неукоснительного чтения API для классов, которые я использую, я разобрал по кусочкам кусочки wx wiki и учебные пособия, чтобы обернуть все вместе.

Но почему-то тестируемые виджеты, два ListBox, которые должны быть расположены друг над другом, вместо этого появляются поверх друг друга.
Первый ListBox я вижу только один раз, когда нажимаю: элементы появляются, когда я их выбираю, и TABbing возвращается к первому списку.

Я явно что-то случайно пропускаю. Оглядываясь вокруг, я подумал, что проблема в том, что я неправильно использовал Layout(), но я протестировал его со всеми контейнерами безрезультатно. Кроме того, проблемы, которые я обнаружил в Интернете, похоже, упоминают изменение размера для обновления окна, но даже при изменении размера моего окна ничего ценного не происходит.

Наконец, вот код:

import wx


class MainWindow(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, id=-1,
                         title="Test Window",
                         style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX))

        main_panel = wx.Panel(parent=self, id=wx.ID_ANY)

        wx.ListBox(main_panel, id=wx.ID_ANY, size=wx.Size(200, 200),
                   style=wx.LB_SINGLE | wx.LB_ALWAYS_SB | wx.LB_SORT,
                   choices=[
                       "Babble",
                       "Bobble",
                       "Bubble"
                   ])
        wx.ListBox(main_panel, id=wx.ID_ANY, size=wx.Size(200, 200),
                   style=wx.LB_SINGLE | wx.LB_ALWAYS_SB,
                   choices=[
                       "One",
                       "Two",
                       "Three"
                   ])

        main_grid = wx.GridSizer(cols=1, rows=2, gap=wx.Size(50, 50))
        main_grid.Add(main_panel)

        self.SetAutoLayout(True)
        self.SetSizer(main_grid)
        self.Layout()
        self.Show(True)


if __name__ == "__main__":
    app = wx.App(False)
    app.SetTopWindow(MainWindow())
    app.MainLoop()

1 ответ

Решение

Дайте названия отдельным элементам и добавьте их в сортировщик, а не на всю панель.

import wx


class MainWindow(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, id=-1,
                         title="Test Window",
                         style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX))

        main_panel = wx.Panel(parent=self, id=wx.ID_ANY, size=(400,600))

        list1 = wx.ListBox(main_panel, id=wx.ID_ANY, size=wx.Size(200, 200),
                   style=wx.LB_SINGLE | wx.LB_ALWAYS_SB | wx.LB_SORT,
                   choices=[
                       "Babble",
                       "Bobble",
                       "Bubble"
                   ])
        list2 = wx.ListBox(main_panel, id=wx.ID_ANY, size=wx.Size(200, 200),
                   style=wx.LB_SINGLE | wx.LB_ALWAYS_SB,
                   choices=[
                       "One",
                       "Two",
                       "Three"
                   ])

        main_grid = wx.GridSizer(cols=1, gap=(50,50))
        main_grid.Add(list1)
        main_grid.Add(list2)

        self.SetAutoLayout(True)
        self.SetSizer(main_grid)
        self.Layout()
        self.Show(True)


if __name__ == "__main__":
    app = wx.App(False)
    app.SetTopWindow(MainWindow())
    app.MainLoop()
Другие вопросы по тегам