Автор оригинала: Mike Driscoll.
Каждая пару месяцев, я увижу, что кто-то спрашивает, как переключаться между двумя видами или панелями в приложении WXPYPHON, на котором они работают. Поскольку это такой общий вопрос, и потому что я спросил на прошлой неделе на канале WXPYPHON на IRC, я записал быстрый скрипт, который показывает, как это сделано. Обратите внимание, что в большинстве случаев пользователь, вероятно, найдет одно из множества виджетов ноутбуков, чтобы быть более чем достаточным для
В этом примере мы будем использовать меню для переключения между двумя панелями. Первая панель будет иметь только текстовое управление на нем, а вторая панель будет иметь виджет сетки.
import wx import wx.grid as gridlib ######################################################################## class PanelOne(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent=parent) txt = wx.TextCtrl(self) ######################################################################## class PanelTwo(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent=parent) grid = gridlib.Grid(self) grid.CreateGrid(25,12) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(grid, 0, wx.EXPAND) self.SetSizer(sizer) ######################################################################## class MyForm(wx.Frame): #---------------------------------------------------------------------- def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Panel Switcher Tutorial") self.panel_one = PanelOne(self) self.panel_two = PanelTwo(self) self.panel_two.Hide() self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.panel_one, 1, wx.EXPAND) self.sizer.Add(self.panel_two, 1, wx.EXPAND) self.SetSizer(self.sizer) menubar = wx.MenuBar() fileMenu = wx.Menu() switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, "Switch Panels", "Some text") self.Bind(wx.EVT_MENU, self.onSwitchPanels, switch_panels_menu_item) menubar.Append(fileMenu, '&File') self.SetMenuBar(menubar) #---------------------------------------------------------------------- def onSwitchPanels(self, event): """""" if self.panel_one.IsShown(): self.SetTitle("Panel Two Showing") self.panel_one.Hide() self.panel_two.Show() else: self.SetTitle("Panel One Showing") self.panel_one.Show() self.panel_two.Hide() self.Layout() # Run the program if __name__ == "__main__": app = wx.App(False) frame = MyForm() frame.Show() app.MainLoop()
Единственный код, который мы заботимся о, находится в onswitchpanels обработчик события. Здесь мы используем условное, чтобы проверить, какая панель отображается, а затем скрыть текущий и показать другое. Мы также устанавливаем заголовок кадра, чтобы сделать его очевидным, какая панель которой. Нам также необходимо вызвать метод макета кадра (), чтобы заставить панели видимыми. В противном случае вы можете увидеть, что некоторые странные визуальные аномалии, как ничто, не показывая в кадре, если вы не изменяете его незначительно.
Теперь вы знаете, как переключать панели тоже. Если вы планируете делать много визуальных работ, таких как добавление или удаление виджетов, то вы можете посмотреть в методы Freeze и Thout, а затем использовать макет. Они помогают скрыть мерцание, которое можно увидеть, когда вы измените детей панели.