wxPython - 使用 GridSizer 相互叠加的小部件
wxPython - Widgets on top of each other with GridSizer
我正在学习 wxPython 并尝试使用 GridSizer,因为它是我最喜欢的布局处理方式。
除了虔诚地阅读我正在使用的 类 的 API 之外,我还搜集了 wx wiki 和教程中的点点滴滴,将所有内容打包在一起。
但不知何故,我正在测试的小部件,两个本应彼此重叠的列表框,却出现在彼此之上。
单击后我只能看到第一个列表框:当我 select 元素弹出时,TAB 键返回到第一个列表。
显然我无意中跳过了某些内容。环顾四周,我认为问题是我没有正确使用 Layout(),但我用所有容器测试它都无济于事。此外,我在网上发现的问题似乎提到调整大小以刷新 window,但即使调整我的 window 也没有任何有价值的事情发生。
最后,这是代码:
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()
为单个项目命名并将它们添加到 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()
我正在学习 wxPython 并尝试使用 GridSizer,因为它是我最喜欢的布局处理方式。 除了虔诚地阅读我正在使用的 类 的 API 之外,我还搜集了 wx wiki 和教程中的点点滴滴,将所有内容打包在一起。
但不知何故,我正在测试的小部件,两个本应彼此重叠的列表框,却出现在彼此之上。
单击后我只能看到第一个列表框:当我 select 元素弹出时,TAB 键返回到第一个列表。
显然我无意中跳过了某些内容。环顾四周,我认为问题是我没有正确使用 Layout(),但我用所有容器测试它都无济于事。此外,我在网上发现的问题似乎提到调整大小以刷新 window,但即使调整我的 window 也没有任何有价值的事情发生。
最后,这是代码:
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()
为单个项目命名并将它们添加到 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()