0

我正在学习 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()
4

1 回答 1

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()
于 2017-10-01T07:45:33.433 回答