В настоящее время у меня есть приложение 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 (), то он будет работать безупречно, однако мне нужно иметь минимальный размер панели, так что Я не могу просто избавиться от этого.
Любая информация, которая у вас может быть, будет огромной помощью. Спасибо!