воскресенье, 15 июля 2012 г.

wxPython: Как создать мастер (Wizard) (Перевод)


Как-то раз на 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). Тут и содержится большая часть нашего кода. Он контролирует передвижение по страницам мастера вперёд и назад. Сами страницы Вы можете определять так, как хотите. Затем я добавляю три страницы и делаю некоторые проверки по ходу. Надеюсь, другим это тоже будет интересно. Удачи!

Домашнее чтение

Комментариев нет:

Отправить комментарий

[フレーム]

AltStyle によって変換されたページ (->オリジナル) /