Размещение элементов (панелей) в wx.GridBagSizer

Я использую gridbagsizer для размещения двух панелей внутри фрейма.

control_panel = wx.Panel(self, id=ID_CONTROL_PANEL) main_panel = wx.Panel(self, id=ID_MAIN_PANEL) frame_sizer = wx.GridBagSizer(1, 1) frame_sizer.Add(control_panel, (0, 0), (2, 5), flag=wx.EXPAND) frame_sizer.Add(main_panel, (2, 0), (5, 5), flag=wx.EXPAND) frame_sizer.AddGrowableRow(0) frame_sizer.AddGrowableCol(0) self.SetSizer(frame_sizer) 

Я хочу, чтобы control_panel находился выше main_panel (как вы можете видеть выше). Однако это результат, который я получаю:

alt text

Я не знаю, почему верхняя панель намного больше нижней панели, когда я указал противоположное. (2, 5) для верха и (5, 5) для дна. У меня также странное поведение, когда я изменяю его размер меньше, он в основном дает мне то, что я хочу (см. Изображение ниже), но я не знаю, как поддерживать соотношение, когда я делаю его больше.

alt text

Однако, когда вы начинаете изменять размер больше (даже на небольшую величину), вы можете видеть (ниже) размеры и соотношение резко меняются в другом направлении (при этом снизу становится намного меньше, а верхнее – намного больше).

alt text

Все еще пытаюсь изучить эти sizers и не может найти эту проблему ни с одним из примеров, которые я видел. Также попробовал экспериментировать со всеми параметрами и делать некоторые тесты, и я не могу понять, что здесь происходит. Любая помощь приветствуется.

EDIT: изображение ниже добавлено, чтобы помочь пояснить ниже. alt text

2 Solutions collect form web for “Размещение элементов (панелей) в wx.GridBagSizer”

Лично я бы использовал BoxSizer в вертикальной ориентации. Вот простой пример:

 import wx class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial") # Add a panel so it looks the correct on all platforms panel = wx.Panel(self, wx.ID_ANY) control_panel = wx.Panel(panel) control_panel.SetBackgroundColour("Yellow") main_panel = wx.Panel(panel) main_panel.SetBackgroundColour("Blue") sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(control_panel, 3, wx.EXPAND) sizer.Add(main_panel, 1, wx.EXPAND) panel.SetSizer(sizer) # Run the program if __name__ == "__main__": app = wx.PySimpleApp() frame = MyForm().Show() app.MainLoop() 

Я изменил цвет фона каждой панели, чтобы было легче определить, что именно. Обратите внимание, что я дал панели управления часть из 3, а основная панель – из 1. Возможно, вы захотите также взглянуть на инструмент проверки виджетов, чтобы помочь вам визуализировать его:

http://wiki.wxpython.org/Widget%20Inspection%20Tool

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

Панель управления занимает первую строку, поэтому она расширяется, чтобы заняться свободным пространством.

Флаг wx.EXPAND действует только в том случае, если ячейка находится в растущей строке или столбце.

  • Как установить wxPython с помощью virtualenv
  • Qt теперь выпущен под LGPL, вы бы порекомендовали его по wxWidgets?
  • Не редактируемое текстовое поле в wxPython
  • Как установить wxversion для Python
  • Минималистичное отображение в реальном времени в Python
  • wxPython - динамически обновляет listctrl в зависимости от ввода в textctrl
  • Python / wxPython: непрерывная работа в фоновом режиме
  • Выпускной пакетировочный паук с cx_Freeze или py2exe
  • Python - лучший язык программирования в мире.