【问题标题】:Why lists cannot be used with wx.BoxSizer?为什么列表不能与 wx.BoxSizer 一起使用?
【发布时间】:2020-01-11 12:49:48
【问题描述】:

我想使用由 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】:

    问题是,您有列表 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)
    

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 2018-03-09
      • 2021-06-14
      • 2012-10-09
      • 2020-03-18
      • 2017-11-21
      • 2019-04-11
      • 2012-09-19
      相关资源
      最近更新 更多