Как-то раз на StackOverflow я увидел, что кто-то с переменным успехом борется с виджетом Wizard из wxPython. Мастер (wizard) не даёт больших возможностей по настройке, если взять его самого по себе, так что я решил посмотреть, насколько сложно будет написать мастера самому. Код достаточно краток, но это моя первая бета-версия:
import wx ######################################################################## class WizardPage(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent, title=None): """Конструктор""" wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) if title: title = wx.StaticText(self, -1, title) title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5) sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5) ######################################################################## class WizardPanel(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Конструктор""" wx.Panel.__init__(self, parent=parent) self.pages = [] self.page_num = 0 self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.panelSizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) # добавляем кнопки назад / далее self.prevBtn = wx.Button(self, label="Previous") self.prevBtn.Bind(wx.EVT_BUTTON, self.onPrev) btnSizer.Add(self.prevBtn, 0, wx.ALL|wx.ALIGN_RIGHT, 5) self.nextBtn = wx.Button(self, label="Next") self.nextBtn.Bind(wx.EVT_BUTTON, self.onNext) btnSizer.Add(self.nextBtn, 0, wx.ALL|wx.ALIGN_RIGHT, 5) # окончательное размещение на форме self.mainSizer.Add(self.panelSizer, 1, wx.EXPAND) self.mainSizer.Add(btnSizer, 0, wx.ALIGN_RIGHT) self.SetSizer(self.mainSizer) #---------------------------------------------------------------------- def addPage(self, title=None): """""" panel = WizardPage(self, title) self.panelSizer.Add(panel, 2, wx.EXPAND) self.pages.append(panel) if len(self.pages) > 1: # спрятать все панели после первой panel.Hide() self.Layout() #---------------------------------------------------------------------- def onNext(self, event): """""" pageCount = len(self.pages) if pageCount-1 != self.page_num: self.pages[self.page_num].Hide() self.page_num += 1 self.pages[self.page_num].Show() self.panelSizer.Layout() else: print "End of pages!" if self.nextBtn.GetLabel() == "Finish": # закрыть self.GetParent().Close() if pageCount == self.page_num+1: # изменить метку self.nextBtn.SetLabel("Finish") #---------------------------------------------------------------------- def onPrev(self, event): """""" pageCount = len(self.pages) if self.page_num-1 != -1: self.pages[self.page_num].Hide() self.page_num -= 1 self.pages[self.page_num].Show() self.panelSizer.Layout() else: print "Вы уже на первой странице!" ######################################################################## class MainFrame(wx.Frame): """""" #---------------------------------------------------------------------- def __init__(self): """Конструктор""" wx.Frame.__init__(self, None, title="Generic Wizard", size=(800,600)) self.panel = WizardPanel(self) self.panel.addPage("Page 1") self.panel.addPage("Page 2") self.panel.addPage("Page 3") self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop()
Главный фрейм инициализирует нашу главную панель (WizardPanel). Тут и содержится большая часть нашего кода. Он контролирует передвижение по страницам мастера вперёд и назад. Сами страницы Вы можете определять так, как хотите. Затем я добавляю три страницы и делаю некоторые проверки по ходу. Надеюсь, другим это тоже будет интересно. Удачи!
Домашнее чтение
- wxPython: Руководство по созданию мастеров
Комментариев нет:
Отправить комментарий