为什么列表不能与wx.BoxSizer一起使用?

问题描述 投票:0回答:1

我想使用由wx.BoxSizer元素制成的列表来使我的代码更具可读性和易于管理,但由于某些原因,wxpython无法使用这种列表。

因此,我在这里编写了无需使用列表即可正常运行的代码:

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
        hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer3 = wx.BoxSizer(wx.HORIZONTAL)

        ts = [wx.StaticText(self, -1, str(i)) for i in range(3)]
        ct  = [wx.TextCtrl(self, -1) for i in range(3)]

        hsizer1.Add(ts[0], 1, wx.EXPAND)
        hsizer2.Add(ts[1], 1, wx.EXPAND)
        hsizer3.Add(ts[2], 1, wx.EXPAND)

        hsizer1.Add(ct[0], 1, wx.EXPAND)
        hsizer2.Add(ct[1], 1, wx.EXPAND)
        hsizer3.Add(ct[2], 1, wx.EXPAND)



        vsizer.Add(hsizer1, 1, wx.ALIGN_CENTER)
        vsizer.Add(hsizer2, 1, wx.ALIGN_CENTER)
        vsizer.Add(hsizer3, 1, wx.ALIGN_CENTER)

        self.SetSizer(vsizer)

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        MyPanel(self)
        self.Layout()
        self.Show()

app = wx.App()
frame = MyFrame(None)
app.MainLoop()

使用此代码,您将获得所需的布局。但是,如果我使用列表和循环,一切都会出错:

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
        hsizer1 = [wx.BoxSizer(wx.HORIZONTAL)]*3
        ts = [wx.StaticText(self, -1, str(i)) for i in range(3)]
        ct = [wx.TextCtrl(self, -1) for i in range(3)]

        for i in range(3):
            hsizer1[i].Add(ts[i], 1, wx.EXPAND)
            hsizer1[i].Add(ct[i], 1, wx.EXPAND)


        for i in hsizer1:
            vsizer.Add(i, 1, wx.ALIGN_CENTER)
        self.SetSizer(vsizer)

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        MyPanel(self)
        self.Layout()
        self.Show()

app = wx.App()
frame = MyFrame(None)
app.MainLoop()

如您所见,它们应该产生完全相同的输出,但不会产生相同的输出。然后我的问题是:为什么在这种情况下不能使用列表?

python list wxpython wxwidgets
1个回答
0
投票

事实是,您拥有列表hsizer1,其中包含3次相同的对象。因此,无论添加到hsizer [0],hsizer [1]还是hsizer [2],都始终添加到相同的sizer中,这并不重要。要解决它:

hsizer1 = [wx.BoxSizer(wx.HORIZONTAL) for i in range(3)]

或者您可以:

for i in range(3):
    hsizer = wx.BoxSizer(wx.HORIZONTAL)
    hsizer.Add(ts[i], 1, wx.EXPAND)
    hsizer.Add(ct[i], 1, wx.EXPAND)
    vsizer.Add(hsizer, 1, wx.ALIGN_CENTER)
© www.soinside.com 2019 - 2024. All rights reserved.