Se você não tem nada a ver com programação, nem tem interesse no assunto, simplesmente ignore este artigo.
Mike Driscoll tem um blog dedicado a Python chamado The Mouse vs. the Python e eventualmente há excelentes artigos por lá.
Esta é uma tradução livre do artigo wxPython: How to Create a Generic Wizard e modifiquei sutilmente algumas coisas, incluindo os exemplos. Agradeço ao Mike pelos excelentes artigos e me desculpo pelas liberdades que tomei na tradução (incluindo a mudança no nome do artigo). Vamos a ele!
Outro dia eu vi no StackOverflow alguém brigando com o widget Wizard, do wxPython. O wizard não permite muita personalização quando se trata dos seus botões, assim eu decidi ver quão difícil seria escrever meu próprio assistente. Este código é bastante limitado, mas aqui está minha primeira versão beta:
# coding: utf-8
import wx ######################################################################## class WizardPage(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent, title=None): """Construtor""" 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): """Construtor""" 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) # adiciona os botões de voltar/avançar self.prevBtn = wx.Button(self, label="Voltar") 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="Avançar") self.nextBtn.Bind(wx.EVT_BUTTON, self.onNext) btnSizer.Add(self.nextBtn, 0, wx.ALL|wx.ALIGN_RIGHT, 5) # conclui o leiaute 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: # esconde todos os painéis depois do primeiro 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 "Fim das páginas!" if self.nextBtn.GetLabel() == "Concluir": # fecha o aplicativo self.GetParent().Close() if pageCount == self.page_num+1: # muda a etiqueta self.nextBtn.SetLabel("Concluir") #---------------------------------------------------------------------- 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 "Você já está na primeira página!" ######################################################################## class MainFrame(wx.Frame): """""" #---------------------------------------------------------------------- def __init__(self): """Construtor""" wx.Frame.__init__(self, None, title="Assistente Genérico", size=(800,600)) self.panel = WizardPanel(self) self.panel.addPage("Página 1") self.panel.addPage("Página 2") self.panel.addPage("Página 3") self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop()
O frame principal instancia nosso painel principal (WizardPanel). Aqui é onde entra a maior parte do nosso código. Ele controla a paginação para a frente e para trás pelas páginas do assistente. Você pode definir as páginas do assistente da maneira que desejar. De fato, o que posso fazer numa segunda versão é fazer com que trabalhe com uma classe Panel de minha própria autoria, já que usar páginas simples como eu fiz o torna bastante limitado. De qualquer maneira, adicionei 3 páginas e testei as iterações entre elas. Espero que outros achem isso interessante também. Divirtam-se!
Comentar