2

メイン プログラム ウィンドウがあり、折り畳み式のパネルを作成したいと考えています。私が言いたいのは、折りたたみ/展開ボタンが付いた、ウィンドウの側面の 1 つに配置されたパネルです。パネルが折りたたまれたり展開されたりすると、他のウィジェットがそれに応じてサイズを変更して、スペースを利用できるようにすることが重要です。

どうすればいいですか?

4

3 に答える 3

5

wx.SplitterWindow を使用する 1 つの方法を次に示します。

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 を確認してください。

于 2009-05-03T13:47:19.513 に答える
1

階層を適切に作成すれば、wxPython (および Swing など) のレイアウト マネージャーがこれを実行できるはずです。したがって、右辺にバインドされていると仮定しましょう。

+-----------------------------+
|+----------------+ +--------+|
||                | | This is||
||                | | your   ||
||   Other stuff  | | panel  ||
||                | +--------+|
||                | +--------+|
||                | | Another||
||                | | panel  ||
|+----------------+ +--------+|
+-----------------------------+

レイアウトが適切に行われると、2 つの列 (1 つは他のもの用、もう 1 つは右側のコンテナー用) を持つトップレベルのレイアウトになります。

そのコンテナーには、上部パネル用と下部パネル用の 2 つの行を持つ独自のレイアウト マネージャーがあります。

こうすることで、トップ パネル (折りたたみ可能なもの) のサイズを変更して短く (折りたたむ) または高くする (展開する) と、レイアウト マネージャーはボトム パネルを拡大または縮小して収まるようにする必要があります。

もちろん、より複雑なレイアウト マネージャーを使用することもできます。ここでは、列/行のスパンやアンカーなどで議論が煩雑にならないようにする方法を説明するために、最も単純なものを選択しました。ウィンドウマネージャを逆にすることで、折りたたみの方向を変更することもできます (水平 <-> 垂直)。

于 2009-05-03T12:57:31.427 に答える