WXPYTHON : 접이식 패널 위젯
-
03-07-2019 - |
문제
메인 프로그램 창이 있고 접이식 패널을 만들고 싶습니다. 내 말은, 접는/펼쳐지는 버튼으로 창의 측면 중 하나에 정렬 된 패널입니다. 패널이 접거나 펼쳐지는 경우 다른 위젯이 크기를 변경하여 공간을 활용하는 것이 중요합니다.
어떻게해야합니까?
해결책
다음은 wx.splitterwindow를 사용하는 한 가지 방법입니다
import wx, wx.calendar
class FoldableWindowContainer(wx.Panel):
def __init__(self, parent, left, right):
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(sizer)
self.splitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
left.Reparent(self.splitter)
right.Reparent(self.splitter)
self.left = left
self.right = right
self.splitter.SplitVertically(self.left, self.right)
self.splitter.SetMinimumPaneSize(50)
self.sash_pos = self.splitter.SashPosition
sizer.Add(self.splitter, 1, wx.EXPAND)
fold_button = wx.Button(self, size=(10, -1))
fold_button.Bind(wx.EVT_BUTTON, self.On_FoldToggle)
sizer.Add(fold_button, 0, wx.EXPAND)
def On_FoldToggle(self, event):
if self.splitter.IsSplit():
self.sash_pos = self.splitter.SashPosition
self.splitter.Unsplit()
else:
self.splitter.SplitVertically(self.left, self.right, self.sash_pos)
class FoldTest(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
left = wx.Panel(self, style=wx.BORDER_SUNKEN)
right = wx.Panel(self, style=wx.BORDER_SUNKEN)
left_sizer = wx.BoxSizer(wx.VERTICAL)
left.SetSizer(left_sizer)
left_sizer.Add(wx.calendar.CalendarCtrl(left), 1, wx.EXPAND | wx.ALL, 5)
left_sizer.Add(wx.Button(left, label="Act"), 0, wx.EXPAND | wx.ALL, 5)
right_sizer = wx.BoxSizer(wx.VERTICAL)
right.SetSizer(right_sizer)
right_sizer.Add(
wx.StaticText(right, label="Fold panel", style=wx.BORDER_RAISED),
1, wx.EXPAND | wx.ALL, 5
)
FoldableWindowContainer(self, left, right)
app = wx.PySimpleApp()
app.TopWindow = FoldTest()
app.TopWindow.Show()
app.MainLoop()
또한 WXPython 데모에서 WX.CollapsiblePane을 확인하십시오.
다른 팁
Wxpython (및 스윙 및 기타)의 레이아웃 관리자는 계층 구조를 올바르게 만들면이 작업을 수행 할 수 있어야합니다. 따라서 오른쪽에 묶여 있다고 가정 해 봅시다.
+-----------------------------+
|+----------------+ +--------+|
|| | | This is||
|| | | your ||
|| Other stuff | | panel ||
|| | +--------+|
|| | +--------+|
|| | | Another||
|| | | panel ||
|+----------------+ +--------+|
+-----------------------------+
레이아웃이 올바르게 완료되면 두 개의 열이있는 최상위 레이아웃이 있고 하나는 다른 항목과 오른쪽 컨테이너 용 레이아웃이 있습니다.
저것 컨테이너에는 두 개의 행이있는 자체 레이아웃 관리자가 있습니다. 하나는 상단 패널 용, 하나는 아래쪽에 있습니다.
이렇게하면 상단 패널 (접이식 패널)을 크기를 조정할 때 (접을 수있는) 더 짧거나 키가 큰 (전개)로, 레이아웃 관리자는 하단 패널을 확장하거나 계약해야합니다.
분명히 더 복잡한 레이아웃 관리자를 사용할 수 있습니다. 가장 간단한 레이아웃 관리자를 선택하여 열/행 스팬 및 앵커 등으로 토론을 어지럽히지 않고 수행하는 방법을 설명했습니다. 또한 창 관리자를 되돌려 접는 방향을 변경할 수도 있습니다 (수평 <-> 수직).
Toni Ruža의 원래 예는 4.0/Phoenix 미만으로 약간의 수정을합니다. 아주 좋은 작업 예, 감사합니다 Toni!
import wx
import wx.adv
class FoldableWindowContainer(wx.Panel):
def __init__(self, parent, left, right):
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(sizer)
self.splitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
left.Reparent(self.splitter)
right.Reparent(self.splitter)
self.left = left
self.right = right
self.splitter.SplitVertically(self.left, self.right)
self.splitter.SetMinimumPaneSize(50)
self.sash_pos = self.splitter.GetSashPosition()
sizer.Add(self.splitter, 1, wx.EXPAND)
fold_button = wx.Button(self, size=(10, -1))
fold_button.Bind(wx.EVT_BUTTON, self.On_FoldToggle)
sizer.Add(fold_button, 0, wx.EXPAND)
def On_FoldToggle(self, event):
if self.splitter.IsSplit():
self.sash_pos = self.splitter.GetSashPosition()
self.splitter.Unsplit()
else:
self.splitter.SplitVertically(self.left, self.right, self.sash_pos)
class FoldTest(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
left = wx.Panel(self, style=wx.BORDER_SUNKEN)
right = wx.Panel(self, style=wx.BORDER_SUNKEN)
left_sizer = wx.BoxSizer(wx.VERTICAL)
left.SetSizer(left_sizer)
left_sizer.Add(wx.adv.CalendarCtrl(left), 1, wx.EXPAND | wx.ALL, 5)
# left_sizer.Add(wx.Button(left, label="Act"), 0, wx.EXPAND | wx.ALL, 5) # uncommented as unbound
right_sizer = wx.BoxSizer(wx.VERTICAL)
right.SetSizer(right_sizer)
right_sizer.Add(wx.StaticText(right, label="Fold this panel using the thin vertical button on the right"),
1, wx.EXPAND | wx.ALL, 5)
FoldableWindowContainer(self, left, right)
if __name__ == '__main__':
app = wx.App()
ex = FoldTest()
ex.Show()
app.MainLoop()