wxPython - 使用GridSizer将窗口小部件放在一起

时间:2017-09-30 19:49:11

标签: wxpython grid-layout sizer wxpython-phoenix

我正在学习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 个答案:

答案 0 :(得分:0)

提供单个项目名称并将其添加到sizer,而不是整个面板。

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