2013-06-27 4 views
0

Обращаем ваше внимание, что это не дубликат wxPython: displaying multiple widgets in same frame, его добавили сомнение.Как использовать sizers в Wxpython для размещения нескольких виджетов в одном фрейме?

Итак, у меня уже есть ноутбук и кнопка на одном кадре. Исходный код:

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() 



     self.button1 = wx.Button(self, -1, label = "Ok") 
     #self.button2 = wx.Button(self, -1, label = "Not Ok") 

     sizerV = wx.BoxSizer(wx.VERTICAL) 

     # add notebook first, with size factor 2: 
     sizerV.Add(nb, 5) 
     # then text, size factor 1, maximized 
     sizerV.Add(self.button1, 1, wx.EXPAND) 

     # assign the sizer to Frame: 
     self.SetSizerAndFit(sizerV) 

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, 'Pandel.py') 
     frame.Show(True) 
     frame.Center() 
     frame2 = MyFrame(None, -1, '') 
     self.SetTopWindow(frame2) 
     return True 


app = MyApp(0) 
app.MainLoop() 

ВЫВОД: sample output

Но я хочу две кнопки, которые находятся рядом друг с другом, вместо того, что одна большая кнопка через мой экран.

То есть я хочу использовать wx.HORIZONTAL и WX.VERTICAL sizers вместе. Как мне это сделать?

ответ

2

Лучший способ подумать о сабизаторах и панелях и тому подобное - это контейнеры. Для сложных макетов я рекомендую захватить карандаш и лист бумаги и составить схему вашего макета. Затем нарисуйте ящики вокруг виджетов. Эти коробки являются вашими sizers (или иногда это панели AND sizers). Во всяком случае, вы быстро поймете из всего, что рисует, что ящики могут быть вложены друг в друга. Это ключ с BoxSizers. Вы можете их гнездиться! Это может ввести в заблуждение, но если вы сохраните свой код на самом деле понятным и продуманным, он отлично работает.

Во всяком случае достаточно моей прозы, вот код:

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() 



     self.button1 = wx.Button(self, -1, label = "Ok") 
     self.button2 = wx.Button(self, -1, label = "Not Ok") 

     sizerV = wx.BoxSizer(wx.VERTICAL) 
     sizerH = wx.BoxSizer(wx.HORIZONTAL) 

     # add notebook first, with size factor 2: 
     sizerV.Add(nb, 5) 
     # then text, size factor 1, maximized 
     sizerH.Add(self.button1, 1, wx.EXPAND) 
     sizerH.Add(self.button2, 1, wx.EXPAND) 
     sizerV.Add(sizerH, 1, wx.ALL|wx.EXPAND, 5) 

     # assign the sizer to Frame: 
     self.SetSizerAndFit(sizerV) 

    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, 'Pandel.py') 
     frame.Show(True) 
     frame.Center() 
     frame2 = MyFrame(None, -1, '') 
     self.SetTopWindow(frame2) 
     return True 


app = MyApp(0) 
app.MainLoop() 
+0

Это гениально, добавляя SizerH к SizerV, спасибо ... –