Creating a wizard in Tkinter

Tkinter, the standard GUI toolkit for Python, provides a robust foundation for creating graphical user interfaces. A wizard, in the context of a Tkinter application, typically involves multiple steps or pages that guide users through a specific workflow. The user navigates through these steps using "Next" and "Back" buttons until they reach the final step.

In this article, we'll explore the creation of a simple three-step wizard using Tkinter. Each step is represented by a distinct frame, and we'll implement navigation logic to move between wizard steps seamlessly.

Understanding the Wizard Structure

A wizard typically consists of multiple steps or pages, each representing a stage in a process. Users navigate through these steps using "Next" and "Back" buttons until they reach the final step. The key components include:

  • A main container to hold all wizard frames
  • Individual frame classes for each step
  • Navigation methods to switch between frames
  • Button controls for user interaction

Setting up the Wizard Application

First, we create the main wizard class that inherits from tk.Tk. This class manages the overall wizard structure ?

import tkinter as tk
from tkinter import ttk

class Wizard(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title("Creating a Wizard in Tkinter")
        self.geometry("400x200")

        # Create a container to hold wizard frames
        self.container = ttk.Frame(self)
        self.container.pack(side="top", fill="both", expand=True)
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        # Define wizard steps
        steps = [Step1, Step2, Step3]

        for Step in steps:
            frame = Step(self.container, self)
            self.frames[Step] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(Step1)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

Creating Individual Wizard Steps

Each wizard step is a separate class that inherits from ttk.Frame. Here are the three steps with appropriate navigation buttons ?

class Step1(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Welcome to Step 1", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the first step of the wizard.")
        info_label.pack(pady=10)
        
        button = ttk.Button(self, text="Next", command=lambda: controller.show_frame(Step2))
        button.pack(pady=10)

class Step2(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Welcome to Step 2", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the second step. You can go back or continue.")
        info_label.pack(pady=10)
        
        button_frame = ttk.Frame(self)
        button_frame.pack(pady=10)
        
        back_button = ttk.Button(button_frame, text="Back", command=lambda: controller.show_frame(Step1))
        back_button.pack(side="left", padx=5)
        
        next_button = ttk.Button(button_frame, text="Next", command=lambda: controller.show_frame(Step3))
        next_button.pack(side="left", padx=5)

class Step3(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Final Step", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the final step. Click Finish to complete.")
        info_label.pack(pady=10)
        
        button_frame = ttk.Frame(self)
        button_frame.pack(pady=10)
        
        back_button = ttk.Button(button_frame, text="Back", command=lambda: controller.show_frame(Step2))
        back_button.pack(side="left", padx=5)
        
        finish_button = ttk.Button(button_frame, text="Finish", command=self.finish)
        finish_button.pack(side="left", padx=5)

    def finish(self):
        print("Wizard completed successfully!")
        # You can add cleanup or final actions here

Complete Working Example

Here's the complete wizard application that you can run ?

import tkinter as tk
from tkinter import ttk

class Wizard(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title("Creating a Wizard in Tkinter")
        self.geometry("400x200")

        # Create a container to hold wizard frames
        self.container = ttk.Frame(self)
        self.container.pack(side="top", fill="both", expand=True)
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        # Define wizard steps
        steps = [Step1, Step2, Step3]

        for Step in steps:
            frame = Step(self.container, self)
            self.frames[Step] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(Step1)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class Step1(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Welcome to Step 1", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the first step of the wizard.")
        info_label.pack(pady=10)
        
        button = ttk.Button(self, text="Next", command=lambda: controller.show_frame(Step2))
        button.pack(pady=10)

class Step2(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Welcome to Step 2", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the second step. You can go back or continue.")
        info_label.pack(pady=10)
        
        button_frame = ttk.Frame(self)
        button_frame.pack(pady=10)
        
        back_button = ttk.Button(button_frame, text="Back", command=lambda: controller.show_frame(Step1))
        back_button.pack(side="left", padx=5)
        
        next_button = ttk.Button(button_frame, text="Next", command=lambda: controller.show_frame(Step3))
        next_button.pack(side="left", padx=5)

class Step3(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        
        label = ttk.Label(self, text="Final Step", font=("Arial", 14))
        label.pack(pady=20)
        
        info_label = ttk.Label(self, text="This is the final step. Click Finish to complete.")
        info_label.pack(pady=10)
        
        button_frame = ttk.Frame(self)
        button_frame.pack(pady=10)
        
        back_button = ttk.Button(button_frame, text="Back", command=lambda: controller.show_frame(Step2))
        back_button.pack(side="left", padx=5)
        
        finish_button = ttk.Button(button_frame, text="Finish", command=self.finish)
        finish_button.pack(side="left", padx=5)

    def finish(self):
        print("Wizard completed successfully!")

if __name__ == "__main__":
    app = Wizard()
    app.mainloop()
Wizard completed successfully!

Key Features

The wizard implementation includes several important features:

  • Frame Management: All frames are created at initialization and stacked using grid()
  • Navigation Logic: The show_frame() method uses tkraise() to bring the desired frame to the front
  • Step Isolation: Each step is an independent class with its own widgets and logic
  • Flexible Design: Easy to add more steps by creating new frame classes

Conclusion

Creating a wizard in Tkinter involves managing multiple frames within a container and implementing navigation logic to switch between steps. This approach provides a clean, organized way to guide users through multi-step processes. You can extend this foundation by adding input validation, progress indicators, or custom styling to create more sophisticated wizards for your applications.

Updated on: 2026-04-02T17:19:20+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements