كسبيثون: لوحة قابلة للطي القطعة
-
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()
وبالإضافة إلى ذلك، تحقق من 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()