Почему списки нельзя использовать с wx.BoxSizer? - PullRequest
0 голосов
/ 11 января 2020

Я хотел использовать списки, созданные элементами wx.BoxSizer, чтобы сделать мой код более читабельным и легким в управлении, но по какой-то причине wx python не может использовать этот вид списков.

Итак, здесь я написал код, который хорошо работает без использования списков:

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()

Как вы можете видеть, они должны выдавать тот же результат, но это не так. Мой вопрос: почему списки не могут быть использованы в этом случае?

1 Ответ

0 голосов
/ 11 января 2020

Дело в том, что у вас есть список 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)
...