Автор оригинала: Mike Driscoll.
На днях на Stackoverflow Я видел кого-то, кто борется с виджетом волшебника от Wxpython. Волшебник не позволяет много настроить, когда речь идет о его кнопках, поэтому я решил посмотреть, как тяжело было бы просто написать свой собственный волшебник. Этот код довольно ограничен, но вот моя первая бета-версия:
import wx ######################################################################## class WizardPage(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent, title=None): """Constructor""" 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): """Constructor""" 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) # add prev/next buttons 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) # finish layout 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: # hide all panels after the first one 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": # close the app self.GetParent().Close() if pageCount == self.page_num+1: # change label 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 "You're already on the first page!" ######################################################################## class MainFrame(wx.Frame): """""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" 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). Вот где идет большая часть нашего кода. Он контролирует пейджинг взад и вперед по страницам мастера в конце концов. Вы можете определить страницы Wizard любой, как вам нравится. Фактически, что я могу сделать в 2-й версии, это делает его, чтобы я мог просто пройти в классе панели моего собственного изготовления, поскольку только с помощью простой страницы я придумал, действительно ограничивается. Во всяком случае, я добавляю 3 страницы, а затем у меня есть некоторые проверки для итерации через них. Я надеюсь, что другие тоже находят это интересно. Повеселись!
Дальнейшее чтение
WxPython: || Учебник волшебника