2013-02-20 3 views
1

Код компилируется в порядке, просто возникли проблемы с загрузкой второй панели. Я просмотрел много форумов по переключению на панели, но ни один из них не помог.wxpython не может переключить панель

import wx 

class Example(wx.Frame): 
    def __init__(self, parent, title): 
     ##super(Example, self).__init__(parent, title=title, 
     ##        size=(500, #width 
     ##          300)) #height 
     wx.Frame.__init__(self, None, size=(900,270)) 
     self.InitUI() 
     self.Centre() 
     self.Show() 

    #define User Interface 
    def InitUI(self): 
     self.panel1 = wx.Panel(self, -1) 

     #Menu bar 
     menubar = wx.MenuBar() 
     filem = wx.Menu() 
     editm = wx.Menu() 
     helpm = wx.Menu() 

     menubar.Append(filem, '&File') 
     menubar.Append(editm, '&Edit') 
     menubar.Append(helpm,'&help') 
     self.SetMenuBar(menubar) 

     hbox = wx.BoxSizer(wx.HORIZONTAL) 
     #buttons 
     b1 = wx.Button(self.panel1, label='button', size=(300,30), pos=(0,0)) 
     hbox.Add(b1) 
     b1.Bind(wx.EVT_BUTTON, self.OnB1) 


     #panel2 
     self.panel2 = wx.Panel(self.panel1, -1) 
     self.panel2.Hide() 
     vbox = wx.BoxSizer(wx.HORIZONTAL) 
     b2 = wx.Button(self.panel2, label='button2', size=(300,30), pos=(0,0)) 
     vbox.Add(b2) 

    def OnB1(self, event): 
     self.panel2.Show() 
     self.panel1.Hide() 


if __name__ == '__main__': 
    app = wx.App() 
    Example(None, title='') 
    app.MainLoop() 
+0

и вопрос? – VladL

+0

Почему этот код не работает правильно, вторая панель никогда не появляется с другой кнопкой – Iancovici

ответ

0

Ваш panel2 имеет panel1 в качестве родителя. Когда вы скрываете родителя, вы также скрываете своих детей.

Также вы не используете основной сизер для своего фрейма. Это означает, что он создан для вас неявно, и первый объект, добавленный в кадр (panel1), помещается внутри этого sizer. Ваш panel2 не включен в sizer, поэтому фиксирование родителей приведет к тому, что panel2 будет видно после щелчка, но не будет изменен.

Вы можете исправить это так:

import wx 

class Example(wx.Frame): 
    def __init__(self, parent, title): 
     ##super(Example, self).__init__(parent, title=title, 
     ##        size=(500, #width 
     ##          300)) #height 
     wx.Frame.__init__(self, None, size=(900,270)) 
     self.InitUI() 
     self.Centre() 
     self.Show() 

    #define User Interface 
    def InitUI(self): 
     self.sizer = wx.BoxSizer() # Main window sizer 

     self.panel1 = wx.Panel(self, -1) 
     self.sizer.Add(self.panel1, 1, flag=wx.EXPAND) 

     #Menu bar 
     menubar = wx.MenuBar() 
     filem = wx.Menu() 
     editm = wx.Menu() 
     helpm = wx.Menu() 

     menubar.Append(filem, '&File') 
     menubar.Append(editm, '&Edit') 
     menubar.Append(helpm,'&help') 
     self.SetMenuBar(menubar) 

     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     #buttons 
     b1 = wx.Button(self.panel1, label='button', size=(300,30), pos=(0,0)) 
     self.hbox.Add(b1) 
     b1.Bind(wx.EVT_BUTTON, self.OnB1) 
     self.panel1.SetSizer(self.hbox) 


     #panel2 
     self.panel2 = wx.Panel(self, -1) 
     self.sizer.Add(self.panel2, 1, flag=wx.EXPAND) 
     self.panel2.Hide() 
     self.vbox = wx.BoxSizer(wx.HORIZONTAL) 
     b2 = wx.Button(self.panel2, label='button2', size=(300,30), pos=(0,0)) 
     self.vbox.Add(b2) 
     self.panel2.SetSizer(self.vbox) 

     self.SetSizer(self.sizer) # Set main window sizer 

    def OnB1(self, event): 
     self.panel2.Show() 
     self.panel1.Hide() 
     self.sizer.Layout() # Force the main window sizer to recalculate 

if __name__ == '__main__': 
    app = wx.App(False) 
    Example(None, title='') 
    app.MainLoop() 
+0

Я ранее пробовал это. Пользовательский интерфейс не отображается правильно, При запуске он отображается только как небольшой квадрат в верхнем левом углу второй панели, а остальное пустое. – Iancovici

+0

См. Только добавленный второй абзац. – Fenikso

+0

Как установить sizer? изначально это делается с помощью wx.Frame .__ init __ (size = (900,270) – Iancovici

Смежные вопросы