2015-04-29 16 views
0

У меня есть это довольно простая настройка в flexgridsizer создающего 3 х 3 сетку: (быстрое примечание для легкого чтения: ПВС = классификаторы, PVP = панели)WxPython - Добавление StaticText изменяет панель

pvs["flex"] = wx.FlexGridSizer(rows = 3, cols = 3, vgap = 0, hgap = 0) 
    for index, vert in enumerate(pv.vertNames): 
     for horiz in pv.horizNames: 
      pvp["{0}_{1}".format(vert, horiz)] = wx.Panel(self) 
      pvp["{0}_{1}".format(vert, horiz)].SetBackgroundColour(c.COLORS["black"]) 

    for panel in pvp.values(): 
     pvs["flex"].Add(panel, flag = wx.EXPAND) 

    proportions = (1, 6, 1) 

    for index, prop in enumerate(proportions): 
     pvs["flex"].AddGrowableCol(index, prop) 
     pvs["flex"].AddGrowableRow(index, prop) 

    self.SetSizer(pvs["flex"]) 

Я не устанавливаю явно размеры панелей, размер которых определяется размерами рядов и столбцов.

Позже вниз путь, я добавить, скажем, 2 statictexts к середине верхней панели:

pvs[me] = {"vert": wx.BoxSizer(wx.VERTICAL)} 
    pvt[me] = {} 

    panel.SetForegroundColour(c.COLORS["blue"]) 
    pvt[me]["title"] = wx.StaticText(panel, label = c.TITLE) 
    pvt[me]["title"].SetOwnFont(titleFont) 
    pvt[me]["subTitle"] = wx.StaticText(panel, label = c.SUBTITLE) 
    pvt[me]["subTitle"].SetOwnFont(subFont) 

    pvs[me]["vert"].Add(pvt[me]["title"], flag = wx.ALIGN_CENTER) 
    pvs[me]["vert"].Add(pvt[me]["subTitle"], flag = wx.ALIGN_CENTER) 

    panel.SetSizer(pvs[me]["vert"]) 

Наконец к вопросу: Добавление этих statictexts изменяет размеры верхней средней панели, чтобы быть значительно шире и выше. Есть ли способ заблокировать пропорции flexgridsizer? Или, может быть, я делаю что-то неправильно, что я могу изменить это, чтобы избежать такого поведения?

В поиске и устранении неисправностей я обнаружил, что для текста достаточно места, чтобы он соответствовал размеру оригинальной панели, даже если был задан большой размер шрифта. Я могу отбросить размер шрифта до 5, и он становится очень крошечным, но все же изменяет размер панели чуть-чуть крупнее, почти похоже на то, что он пробивается в панель, а не просто внутри.

+0

Выглядит интересно, но это по-прежнему трудно для меня, чтобы понять именно эту проблему. Можете ли вы составить минимальный примерный код, который воспроизводит вашу проблему? http://stackoverflow.com/help/mcve – otterb

+0

@otterb: Спасибо, что посмотрели. Я собирался сделать минимальный пример, когда придумал свой собственный ответ, который мне нравится. Я разместил его ниже. – linus72982

ответ

0

Я обнаружил, что проблема заключалась в том, что я оставлял панели без размера, чтобы они были устойчивы на основе чего-либо, что было в них. Поэтому я решил добавить явные размеры, но по-прежнему держать их гибкими для различных типоразмеров, имея размеры созданных на лету исходя из процентов:

width = self.package.frame.size[0] 
    height = self.package.frame.size[1] 
    corner = ((width * .125), (height * .125)) 
    ns = ((width * .75), (height * .125)) 
    ew = ((width * .125), (height * .75)) 
    mid = ((width * .75), (height * .75)) 
    sizeIter = iter((corner, ns, corner, ew, mid, ew, corner, ns, corner)) 

, а затем это в цикл, который создал панели:

pvp["{0}_{1}".format(vert, horiz)] = wx.Panel(self) 

изменено на:

pvp["{0}_{1}".format(vert, horiz)] = wx.Panel(self, size = next(sizeIter)) 
+0

Я вижу. Тогда мне интересно, поможет ли SetSizeHints в этой ситуации. Вы можете найти дополнительную информацию об этом здесь http://www.blog.pythonlibrary.org/2008/05/22/wxpython-sizers-tutorial-using-a-gridbagsizer/ – otterb