Crea un Wizard amigable para actividades o previo de instalaciones, con múltiples páginas, del tipo "siguiente, siguiente (...) Terminar"

Sacando todo el código necesario para generar el Wizard en sí mismo, agregar nuevas páginas es simple.

Las páginas pueden contener cualquier widget, en este ejemplo solo se usa 1 label por cada una.

Screenshot:

/images/TKWizards/temp.jpg
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
try:
    import Tkinter as tk  # Python2
except ImportError:
    import tkinter as tk  # Python3

class Wizard(tk.Toplevel):
    def __init__(self, npages, master=None):
        self.master = master
        self.pages = []
        self.current = 0
        tk.Toplevel.__init__(self)
        #self.overrideredirect() # saca el decorador de ventana
        self.protocol("WM_DELETE_WINDOW", self.onQuit)
        #self.attributes('-toolwindow', True) # ToolWindowz
        self.attributes('-topmost', True)
        if master:
            self.transient(self.master)
            self.lift(master)
        for page in range(npages):
            self.pages.append(tk.Frame(self))
        self.pages[0].pack(fill='both', expand=1)
        self.__wizard_buttons()

    def onQuit(self):
        pass # hace algo on quit

    def __wizard_buttons(self):
        for indx, frm in enumerate(self.pages):
            btnframe = tk.Frame(frm, bd=1, bg='#3C3B37')
            btnframe.pack(side='bottom', fill='x')
            nextbtn = tk.Button(btnframe, bd=0, bg='#F2F1F0', activebackground='#F58151', highlightcolor='red', cursor='hand2', text="Siguiente >>", width=10, command=self.__next_page)
            nextbtn.pack(side='right', anchor='e', padx=5, pady=5)
            if indx != 0:
                prevbtn = tk.Button(btnframe, bd=0, bg='#F2F1F0', activebackground='#F58151', highlightcolor='red', cursor='hand2', text="<< Atras", width=10, command=self.__prev_page)
                prevbtn.pack(side='right', anchor='e', padx=5, pady=5)
                if indx == len(self.pages) - 1:
                    nextbtn.configure(text="Terminar", bd=0, bg='#F2F1F0', activebackground='#F58151', highlightcolor='red', cursor='hand2', command=self.close)

    def __next_page(self):
        if self.current == len(self.pages):
            return
        self.pages[self.current].pack_forget()
        self.current += 1
        self.pages[self.current].pack(fill='both', expand=1)

    def __prev_page(self):
        if self.current == 0:
            return
        self.pages[self.current].pack_forget()
        self.current -= 1
        self.pages[self.current].pack(fill='both', expand=1)

    def add_page_body(self, body):
        body.pack(side='top', fill='both', padx=6, pady=12)

    def page(self, page_num):
        try:
            page = self.pages[page_num]
        except KeyError("Pagina Invalida! : %s" % page_num):
            return 0
        return page

    def close(self):
        if self.validate():
            self.master.iconify()
            print (' TK Wizard finished... ')
            self.destroy()
            self.master.destroy() # remover?

    def validate(self):
        return 1 # hace algo

if __name__ == "__main__":
    root = tk.Tk()
    root.title(' TK Wizards ')
    root.focus()
    wizard = Wizard(npages=3, master=root)
    wizard.minsize(400, 350)
    page0 = tk.Label(wizard.page(0), text='Pagina 1: ...Bienvenido al Wizard de TK !')
    page1 = tk.Label(wizard.page(1), text='Pagina 2: Acepta las condiciones de la WTFPL ?')
    page2 = tk.Label(wizard.page(2), text='Pagina 3: Felicitaciones, nada no se ha instalado correctamente.')
    wizard.add_page_body(page0)
    wizard.add_page_body(page1)
    wizard.add_page_body(page2)
    root.mainloop()