سؤال

ولدي النافذة الرئيسية للبرنامج، وأود أن جعل لوحة قابلة للطي. ما أعنيه هو، وهو الفريق الذي يتماشى إلى أحد الجانبين من النافذة، مع أضعاف زر / تتكشف. من المهم أن يحصل عندما مطوية لوحة / تكشفت، وغيرها من الحاجيات تغيير حجم وفقا لذلك للاستفادة من المساحة لديهم.

وكيف أفعل هذا؟

هل كانت مفيدة؟

المحلول

وهنا هي طريقة واحدة باستخدام 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()

وبالإضافة إلى ذلك، تحقق من wx.CollapsiblePane في العروض كسبيثون.

نصائح أخرى

ومديري تخطيط لوكس بايثون (ومراجيح وغيرها) يجب أن تكون قادرة على القيام بذلك لأنك إذا قمت بإنشاء التسلسل الهرمي بشكل صحيح. دعونا نفترض انها منضمة إلى الجانب الأيمن، على النحو التالي:

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

إذا يتم تخطيط الحق الخاص بك، سيكون لديك تخطيط على مستوى عال مع عمودين، واحدة لغيرها من الاشياء واحد للحاوية من الناحية اليمنى.

أن حاوية سيكون لها انها مدير تخطيط الخاصة مع صفين، واحد لوحة أعلى، واحدة للأسفل.

وبهذه الطريقة، عند تغيير حجم لوحة أعلى (واحد طوي الخاص بك) لتكون أقصر (أضعاف) أو أطول (تتكشف)، ينبغي للمدير تخطيط التمدد أو التقلص لوحة أسفل لتناسب.

من الواضح يمكنك استخدام مديري تخطيط أكثر تعقيدا، لقد اخترت أبسط منها لتوضيح كيفية القيام بذلك دون التبعثر مناقشة مع يمتد عمود / صف واحد والمراسي وهلم جرا. يمكنك أيضا تغيير اتجاه للطي عن طريق عكس مديري النافذة. (الأفقي <-> العمودي)

والمثال الأصلي توني روزا، مع تعديلات طفيفة على العمل تحت 4.0 / فينيكس. لطيفة جدا سبيل المثال العمل، وذلك بفضل توني!

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top