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