Monday, August 19, 2024

GUI based Sudoku Solver

import tkinter as tk

from tkinter import messagebox


def is_valid(board, row, col, num):

  for i in range(9):

    if board[row][i] == num or board[i][col] == num:

      return False

  

  start_row, start_col = 3 * (row // 3), 3 * (col // 3)

  for i in range(start_row, start_row + 3):

    for j in range(start_col, start_col + 3):

      if board[i][j] == num:

        return False

  

  return True


def solve_sudoku(board):

  for row in range(9):

    for col in range(9):

      if board[row][col] == 0:

        for num in range(1, 10):

          if is_valid(board, row, col, num):

            board[row][col] = num

            if solve_sudoku(board):

              return True

            board[row][col] = 0

        return False

  return True


def extract_values():

  board = []

  for i in range(9):

    row = []

    for j in range(9):

      val = entries[i][j].get()

      if val == "":

        row.append(0)

      else:

        try:

          row.append(int(val))

        except ValueError:

          messagebox.showerror("Invalid input", f"Invalid value at row {i+1}, column {j+1}. Please enter numbers 1-9.")

          return None

    board.append(row)

  return board


def display_solution(board):

  for i in range(9):

    for j in range(9):

      entries[i][j].delete(0, tk.END)

      entries[i][j].insert(0, str(board[i][j]))


def solve():

  board = extract_values()

  if board:

    if solve_sudoku(board):

      display_solution(board)

    else:

      messagebox.showinfo("No solution", "This Sudoku puzzle has no solution.")


def clear_board():

  for i in range(9):

    for j in range(9):

      entries[i][j].delete(0, tk.END)


# Initialize GUI window

root = tk.Tk()

root.title("Sudoku Solver")


# Create 9x9 grid of Entry widgets

entries = []

for i in range(9):

  row_entries = []

  for j in range(9):

    entry = tk.Entry(root, width=3, font=("Arial", 18), justify="center")

    entry.grid(row=i, column=j, padx=5, pady=5)

    row_entries.append(entry)

  entries.append(row_entries)


solve_button = tk.Button(root, text="Solve", command=solve, font=("Arial", 14))

solve_button.grid(row=9, column=3, columnspan=3, pady=10)


clear_button = tk.Button(root, text="Clear", command=clear_board, font=("Arial", 14))

clear_button.grid(row=10, column=3, columnspan=3, pady=10)


root.mainloop()


No comments:

Post a Comment