我想使用由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()
如您所见,它们应该产生完全相同的输出,但不会产生相同的输出。然后我的问题是:为什么在这种情况下不能使用列表?
事实是,您拥有列表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)