2015-04-13 2 views
1

Есть ли способ выполнить итерацию через дочерние элементы wx.GridBagSizer в порядке строк/столбцов?wxPython: GridBagSizer: Итерация по строкам и столбцам gridbagsizer

Я заметил, что могу выполнить GetChildren() на sizer, но я не смог найти документацию в API, которая говорит, как эти дети фактически сопоставляются с строками или столбцами. Есть два способа:

GetEffectiveRowsCount() 
GetEffectiveColsCount() 

Но я не знаю, как использовать их, чтобы перебирать детей. Я включил шаблон ниже:

import wx 
import wx.lib.inspection 


class MyRegion(wx.Frame): 
    I = 0 

    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, title="My Region") 
     gridSizer = wx.GridBagSizer() 

     gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,0), span=(4,1), flag=wx.EXPAND) 
     gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(4,0), span=(4,1), flag=wx.EXPAND) 
     gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,1), span=(4,1), flag=wx.EXPAND) 
     gridSizer.Add(self.CreateStaticBoxSizer(8), pos=(0,2), span=(7,1), flag=wx.EXPAND) 
     gridSizer.Add(self.CreateStaticBoxSizer(6), pos=(0,3), span=(6,1), flag=wx.EXPAND) 

     self.SetSizer(gridSizer) 
     for item in gridSizer.Children: 
      for r in range(0, gridSizer.GetEffectiveRowsCount()): 
       print(item.GetSize()) 

    def CreateStaticBoxSizer(self, x=4): 
     box = wx.StaticBox(parent=self, label="StaticBox::" + str(MyRegion.I)) 
     MyRegion.I += 1 
     sz = wx.StaticBoxSizer(orient=wx.VERTICAL, box=box) 
     for i in range(x): 
      sz.Add(wx.StaticText(parent=sz.GetStaticBox(), 
           label="This window is a child of the staticbox")) 
     return sz 


if __name__ == "__main__": 
    app = wx.App() 
    frame = MyRegion(None) 
    frame.Show() 
    wx.lib.inspection.InspectionTool().Show() 
    app.MainLoop() 

ответ

1

возвращенные детали из GetChildren() просто коллекция элементов добавляется в классификаторе, в порядке их добавления. В классике предметы - wx.SizerItem, поэтому вы не можете получить какую-либо информацию о позиции или охватывать их. Однако в Фениксе они находятся в wx.GBSizerItem объектах, поэтому вы можете использовать GetPos, чтобы найти их местоположение в сетке при желании.

Чтобы выполнить итерацию по пунктам в виде сетки, вы можете использовать FindItemAtPosition, который возвращает wx.GBSizerItem или None, если в заданном положении нет предметов. Итак, что-то вроде этого должно дать вам то, что вы ищете:

for row in gridSizer.GetEffectiveRowsCount(): 
    for col in gridSizer.GetEffectiveColsCount(): 
     item = gridSizer.FindItemAtPosition((row, col)) 
     if item is not None: 
      print(item.GetSize()) 
+0

Спасибо, это именно то, что я ищу :) – Har

Смежные вопросы