كسبيثون: عرض الحاجيات متعددة في نفس الإطار
-
05-07-2019 - |
سؤال
وأود أن تكون قادرة على عرض Notebook
وWX TxtCtrl
الحاجيات في إطار واحد. فيما يلي مثال مقتبس من ويكي كسبيثون. هل من الممكن لتغيير تخطيط الخاصة بهم (وربما مع شيء من هذا القبيل wx.SplitterWindow
) لعرض مربع النص تحت Notebook
في نفس الإطار؟
import wx
import wx.lib.sheet as sheet
class MySheet(sheet.CSheet):
def __init__(self, parent):
sheet.CSheet.__init__(self, parent)
self.SetLabelBackgroundColour('#CCFF66')
self.SetNumberRows(50)
self.SetNumberCols(50)
class Notebook(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(600, 600))
menubar = wx.MenuBar()
file = wx.Menu()
file.Append(101, 'Quit', '' )
menubar.Append(file, "&File")
self.SetMenuBar(menubar)
wx.EVT_MENU(self, 101, self.OnQuit)
nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
self.sheet1 = MySheet(nb)
self.sheet2 = MySheet(nb)
self.sheet3 = MySheet(nb)
nb.AddPage(self.sheet1, "Sheet1")
nb.AddPage(self.sheet2, "Sheet2")
nb.AddPage(self.sheet3, "Sheet3")
self.sheet1.SetFocus()
self.StatusBar()
def StatusBar(self):
self.statusbar = self.CreateStatusBar()
def OnQuit(self, event):
self.Close()
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400))
self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
self.Center()
class MyApp(wx.App):
def OnInit(self):
frame = Notebook(None, -1, 'notebook.py')
frame.Show(True)
frame.Center()
frame2 = MyFrame(None, -1, '')
frame2.Show(True)
self.SetTopWindow(frame2)
return True
app = MyApp(0)
app.MainLoop()
المحلول
وجعل اثنين من الحاجيات تظهر على نفس الإطار من السهل، في الواقع. يجب عليك استخدام sizers لتحقيق ذلك.
في المثال الخاص بك، يمكنك تغيير تطبيق فئة Notebook
الخاص بك إلى شيء من هذا القبيل:
class Notebook(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(600, 600))
menubar = wx.MenuBar()
file = wx.Menu()
file.Append(101, 'Quit', '' )
menubar.Append(file, "&File")
self.SetMenuBar(menubar)
wx.EVT_MENU(self, 101, self.OnQuit)
nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
self.sheet1 = MySheet(nb)
self.sheet2 = MySheet(nb)
self.sheet3 = MySheet(nb)
nb.AddPage(self.sheet1, "Sheet1")
nb.AddPage(self.sheet2, "Sheet2")
nb.AddPage(self.sheet3, "Sheet3")
self.sheet1.SetFocus()
self.StatusBar()
# new code begins here:
# add your text ctrl:
self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
# create a new sizer for both controls:
sizer = wx.BoxSizer(wx.VERTICAL)
# add notebook first, with size factor 2:
sizer.Add(nb, 2)
# then text, size factor 1, maximized
sizer.Add(self.text, 1, wx.EXPAND)
# assign the sizer to Frame:
self.SetSizerAndFit(sizer)
ويتم تغيير فقط طريقة __init__
. لاحظ أنه يمكنك التعامل مع النسب بين جهاز التحكم المحمولة والنص عن طريق تغيير الوسيطة الثانية من الأسلوب Add
.
ويمكنك معرفة المزيد حول sizers من المادة بحجم نظرة عامة .
نصائح أخرى
ويمكنك استخدام الخائن، نعم.
وبالإضافة إلى ذلك، فمن المنطقي لإنشاء الفريق، وضع الحاجيات الخاصة بك في ذلك (مع sizers)، وإضافة هذه اللوحة إلى الإطار.