Сохранение панелей от роста в wxPython

Я пытаюсь расположить некоторые панели в wxPython. Грубое представление макета здесь: Нужен абстрактный пример макета

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

Код, который я имею до сих пор (с некоторыми случайными виджетами-заполнителями), приведен ниже. Мои вопросы следуют за кодом:

import wx
import wx.lib.scrolledpanel as scrolled

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        #add position panel
        posPnl = IdPanel(self)
        lbl1 = wx.StaticText(posPnl, label="Position")
        lbl2 = wx.StaticText(posPnl, label="Size")
        sizeCtrl = wx.TextCtrl(posPnl)

        posPnlSzr = wx.BoxSizer(wx.VERTICAL)
        posPnlSzr.Add(lbl1, 1, wx.FIXED&wx.LEFT)
        posPnlSzr.Add(sizeCtrl, 1, wx.LEFT&wx.FIXED)
        posPnlSzr.Add(lbl2, 1, wx.FIXED&wx.LEFT)

        posPnl.SetSizer(posPnlSzr)

        posPnl2 = TimelinePanel(self)
        lbl12 = wx.StaticText(posPnl2, label="Position")
        lbl22 = wx.StaticText(posPnl2, label="Size")
        sizeCtrl2 = wx.TextCtrl(posPnl2)

        posPnlSzr2 = wx.BoxSizer(wx.VERTICAL)
        posPnlSzr2.Add(lbl12, 1, wx.GROW)
        posPnlSzr2.Add(sizeCtrl2, 1, wx.GROW)
        posPnlSzr2.Add(lbl22, 1, wx.GROW)

        posPnl2.SetSizer(posPnlSzr2)

        mainSzr = wx.BoxSizer(wx.HORIZONTAL)
        mainSzr.Add(posPnl, 1, wx.FIXED)
        #mainSzr.AddSpacer(10)
        mainSzr.Add(posPnl2, 1, wx.GROW)

        self.SetSizerAndFit(mainSzr)
        self.Show()

class IdPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, size = (400, 200))
        self.SetBackgroundColour((255, 0, 255))

class TimelinePanel(scrolled.ScrolledPanel):
    def __init__(self, parent):
        scrolled.ScrolledPanel.__init__(self, parent, -1, size = (300, 200))
        self.SetBackgroundColour((255, 0, 0))


app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()

Мои вопросы:

  1. Как я могу использовать размеры, чтобы обеспечить расширение только правой панели и только по горизонтали? В настоящее время содержимое левой панели остается фиксированным, но сама панель все еще расширяется.
  2. Если бы я хотел немного изменить первый вопрос, чтобы по горизонтали расширялось только правое, а по вертикали - обе панели, что мне нужно делать?
  3. Я использую wx.lib.scrolledpanel для оси x для правой панели, но я никак не могу свернуть окно по горизонтали, чтобы оно появилось. Я не уверен, что есть настройка параметров микширования / максимального размера панели и т. Д., Это может помочь?

1 ответ

Решение

1: использовать proportion Аргумент в sizer. Добавьте при добавлении двух панелей к основному классификатору:

mainSzr.Add(posPnl, 0)
mainSzr.Add(posPnl2, 1)

Пропорция влияет на то, как эта панель изменяет размеры пропорционально всем другим размерам братьев и сестер (где 0 означает, что размер не изменяется). Флаги wx.FIXED а также wx.GROW не имеют отношения к вашей цели здесь.

http://wxpython.org/docs/api/wx.Sizer-class.html

Так, например, если вы хотите увеличить оба, но вправо расти в два раза быстрее, чем левое, вы можете использовать:

mainSzr.Add(posPnl, 1)
mainSzr.Add(posPnl2, 2)

2: Используйте wx.EXPAND флаг, чтобы что-то в горизонтальном сортировщике расширялось, чтобы заполнить его вертикальное пространство (или наоборот для вертикального классификатора / горизонтального пространства).

mainSzr.Add(posPnl, 0, wx.EXPAND)
mainSzr.Add(posPnl2, 1, wx.EXPAND)

3: Добавить self.SetupScrolling() на TimelinePanel's __init__ функция, которая требуется для работы панели прокрутки. Затем, когда содержимое панели будет достаточно большим, чтобы требовать полосы прокрутки, оно будет добавлено.

Другие вопросы по тегам