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()