WX Python Размер вложенного окна SplitterWindow при разбиении - PullRequest
0 голосов
/ 26 апреля 2020

В настоящее время у меня есть приложение GUI в wx python, которое имеет структуру вложенного разделителя . Это выглядит примерно так:

x------------------x---------x
| panel 1          |panel 3  |
|                  |         |
|                  |         |
x------------------x         |
| panel 2          |         |
x------------------x---------x

Я успешно создал кнопку-переключатель, которая отключает 2-ю и 3-ю панели, однако, когда я «перераспределяю» 3-ю панель, возникают некоторые проблемы с размерами. Если я нажимаю на кнопку «Развернуть», размер становится странным, даже если для sashgravity установлено значение 1.

Например: я только что запустил свое приложение, и оно выглядит так:

x------------------x---------x
| panel 1          |panel 3  |
|                  |         |
|                  |         |
|                  |         |
|                  |         |
x------------------x---------x

I затем нажмите кнопку, которая сворачивает панель 3. Когда я переключаю ее обратно, она выглядит нормально. Однако, когда я нажимаю кнопку максимизации на кадре, размер панели 3 становится странным и выглядит примерно так:

x----------x-----------------x
| panel 1  |panel 3          |
|          |                 |
|          |                 |
|          |                 |
|          |                 |
x----------x-----------------x

Я думал, что гравитация sa sh должна была решить эту проблему. , Почему это не работает? Вот абстракция моего кода:

class Frame(wx.Frame):
def __init__(self, parent, size):
    super().__init__(parent, title='Troubled Frame', size=size)

    # Setup panel structure
    self.vSplitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
    self.hSplitter = wx.SplitterWindow(self.vSplitter, style=wx.SP_LIVE_UPDATE)
    self.panel3 = Panel3(self.vSplitter, self)
    self.panel2 = Panel2(self.hSplitter, self)
    self.panel1 = Panel1(self.hSplitter, self)
    self.panel2.Show(False)                 # Initially do not show panel 2
    self.hSplitter.Initialize(self.Panel1)  # Initially do not show panel 2
    self.vSplitter.SplitVertically(self.hSplitter, self.panel2, self.GetSize()[0]-200) 
    # put sash 200 pixels away from the right of frame

    self.hSplitter.SetSashGravity(1)
    self.vSplitter.SetSashGravity(1)

    # Create menu bar with buttons that toggle panels
    self.menuBar = wx.MenuBar()
    self.viewMenu = wx.Menu()
    self.togglePanel2Button = self.viewMenu.Append(wx.ID_ANY, 'Toggle Panel2')
    self.togglePanel3Button = self.viewMenu.Append(wx.ID_ANY, 'Toggle Panel3')
    self.Bind(wx.EVT_MENU, self.togglePanel3, self.togglePanel3Button)
    self.Bind(wx.EVT_MENU, self.togglePanel2, self.togglePanel2Button)

    self.vSplitter.SetMinimumPaneSize(200)
    self.hSplitter.SetMinimumPaneSize(100)


def togglePanel3(self, event):
    if self.vSplitter.IsSplit():
        self.vSplitter.Unsplit()
    else:
        self.vSplitter.SplitVertically(self.hSplitter, self.panel3, self.GetSize()[0]-200)

def togglePanel2(self, event):
    if self.hSplitter.IsSplit():
        self.hSplitter.Unsplit()
    else:
        self.hSplitter.SplitHorizontally(self.panel1, self.panel2, self.GetSize()[1]-200)

Еще более странно то, что если я уберу vSplitter.SetMinimumPaneSize (), то он будет работать безупречно, однако мне нужно иметь минимальный размер панели, так что Я не могу просто избавиться от этого.

Любая информация, которая у вас может быть, будет огромной помощью. Спасибо!

...