def is_solved(grid): """ say if grid is a resolved grid :param grid: a sudoku's grid :type grid: grid :return: True if it's resolved and False if not :rtype: bool :UC: none """ for ind_line in range(9): cell_list = sudoku_grid.get_line(grid, ind_line) if len(set(cells.get_cellvalue(cell) for cell in cell_list)) != 9: return False for ind_col in range(9): cell_list = sudoku_grid.get_colomn(grid, ind_col) if len(set(cells.get_cellvalue(cell) for cell in cell_list)) != 9: return False for ind_square in range(9): cell_list = sudoku_grid.get_square(grid, ind_square) if len(set(cells.get_cellvalue(cell) for cell in cell_list)) != 9: return False return True
def __change(button_grid, ind_line, ind_col): """ this function attributes a new event for cells """ global grid for ind_square in range(9): button_list = sudoku_grid.get_square(button_grid, ind_square) for button in button_list: if button["bg"] in ["blue", "green"]: if ind_square % 2: button.config(bg="grey") else: button.config(bg="white") button = sudoku_grid.get_cell(button_grid, ind_line, ind_col) button.config(bg="blue") win.bind("<Key>", partial(__clavier, button_grid, ind_line, ind_col))
def __change(button_grid,ind_line,ind_col): """ this function attributes a new event for cells :param button_grid: the board of buttons :type button_grid: list of list of ``button`` :param ind_line: the line of the cell :type ind_line: int :param ind_col: the column of the cell :type ind_col: int """ global grid for ind_square in range(9): button_list = sudoku_grid.get_square(button_grid,ind_square) for button in button_list: if ind_square%2: button.config(bg="grey") else: button.config(bg="white") button = sudoku_grid.get_cell(button_grid,ind_line,ind_col) button.config(bg="blue") win.bind("<Key>",partial(__clavier,button_grid,ind_line,ind_col))
def create(): """ This function creates the graphical board for a game. It also launches the event loop. Thus, this is the inly functino to run to have a functional graphical board. """ global img, win, grid, string string = '0' * 81 grid = sudoku_grid.make_grid() win = tk.Tk() win.title('Sudoku Game') iconpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), "icons") img = [ tk.PhotoImage(file=os.path.join(iconpath, "0.gif")), tk.PhotoImage(file=os.path.join(iconpath, "1.gif")), tk.PhotoImage(file=os.path.join(iconpath, "2.gif")), tk.PhotoImage(file=os.path.join(iconpath, "3.gif")), tk.PhotoImage(file=os.path.join(iconpath, "4.gif")), tk.PhotoImage(file=os.path.join(iconpath, "5.gif")), tk.PhotoImage(file=os.path.join(iconpath, "6.gif")), tk.PhotoImage(file=os.path.join(iconpath, "7.gif")), tk.PhotoImage(file=os.path.join(iconpath, "8.gif")), tk.PhotoImage(file=os.path.join(iconpath, "9.gif")) ] button_grid = list() grid_frame = tk.Frame(win, bd=1.5, bg="black") grid_frame.grid(column=0, row=0, columnspan=9, rowspan=9, padx=3, pady=3) for ind_line in range(9): button_grid.insert(ind_line, []) for ind_col in range(9): button = tk.Button(grid_frame, padx=0, pady=0, width=30, height=30, image=img[0]) button.grid(column=ind_col, row=ind_line) button_grid[ind_line].insert(ind_col, button) button.config( command=partial(__change, button_grid, ind_line, ind_col)) button.config(state="disabled") for ind_square in range(9): button_list = sudoku_grid.get_square(button_grid, ind_square) for button in button_list: if ind_square % 2: button.config(bg="grey") else: button.config(bg="white") menu_bar = tk.Menu(win) file_menu = tk.Menu(menu_bar, tearoff=0) solver_menu = tk.Menu(menu_bar, tearoff=1) help_menu = tk.Menu(menu_bar, tearoff=0) open_menuB = tk.Menubutton(file_menu, text="Open") sub_menu = tk.Menu(open_menuB, tearoff=0) sub_menu.add_command(label="Open random grid", command=partial(__open_grid, button_grid)) sub_menu.add_command(label="Open a save grid", command=partial(__open_grid, button_grid, save=True)) file_menu.add_cascade(label="Open", menu=sub_menu) file_menu.add_command(label="Save your grid", command=__save) file_menu.add_separator() file_menu.add_command(label="Back", command=__back) file_menu.add_command(label="Exit", command=win.destroy) solver_menu.add_command(label="Reset", command=partial(__RAZ, button_grid)) solver_menu.add_command(label="Check values", command=partial(__correction, button_grid)) solver_menu.add_separator() solver_menu.add_command(label="Solve grid", command=partial(__solve, button_grid)) solver_menu.add_command(label="Export to solver", command=__export) help_menu.add_command(label="Help", command=help_popup) menu_bar.add_cascade(label="File", menu=file_menu) menu_bar.add_cascade(label="Solver", menu=solver_menu) menu_bar.add_cascade(label="Help", menu=help_menu) win.config(menu=menu_bar) win.mainloop()
def create(string='0'*81): """ this function creates the graphical board from a solver. It also launches the event loop. Thus, this is the only function to run to have a functional graphical board. :param string: the sudoku :type string: str :return: None :rtype: NoneType """ global img,win,grid,recursion_check,image_check,remove_check,talkative_check,start_button,enter_button grid = sudoku_grid.make_grid(string) win = tk.Tk() win.title('Sudoku Solver') iconpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), "icons") img = [ tk.PhotoImage(file=os.path.join(iconpath, "0.gif")), tk.PhotoImage(file=os.path.join(iconpath, "1.gif")), tk.PhotoImage(file=os.path.join(iconpath, "2.gif")), tk.PhotoImage(file=os.path.join(iconpath, "3.gif")), tk.PhotoImage(file=os.path.join(iconpath, "4.gif")), tk.PhotoImage(file=os.path.join(iconpath, "5.gif")), tk.PhotoImage(file=os.path.join(iconpath, "6.gif")), tk.PhotoImage(file=os.path.join(iconpath, "7.gif")), tk.PhotoImage(file=os.path.join(iconpath, "8.gif")), tk.PhotoImage(file=os.path.join(iconpath, "9.gif")) ] button_grid = list() grid_frame = tk.Frame(win,bd=1.5,bg="black") grid_frame.grid(column=0,row=0,columnspan=9,rowspan=9,padx=3,pady=3) for ind_line in range(9): button_grid.insert(ind_line,[]) for ind_col in range(9): cell = sudoku_grid.get_cell(grid, ind_line, ind_col) value = cells.get_cellvalue(cell) button = tk.Button(grid_frame, padx=0, pady=0, width=30, height=30, image=img[int(value)]) button.grid(column=ind_col, row=ind_line) button_grid[ind_line].insert(ind_col, button) button.config(command=partial(__change,button_grid,ind_line,ind_col)) for ind_square in range(9): button_list = sudoku_grid.get_square(button_grid,ind_square) for button in button_list: if ind_square%2: button.config(bg="grey") else: button.config(bg="white") options_frame = tk.Frame(win) options_frame.grid(column=9,row=0,rowspan=10) text = tk.Label(options_frame,text = "options:",font = "bold 16 italic") text.grid(row = 1,pady=10) image_var = tk.IntVar() image_check = tk.Checkbutton(options_frame,text = "arbre",variable = image_var) image_check.grid(row = 2,sticky="nw",padx=2,pady=5) remove_var = tk.IntVar() remove_check = tk.Checkbutton(options_frame,text = "remove",variable = remove_var) remove_check.grid(row = 3,sticky="nw",padx=2,pady=5) talkative_var = tk.IntVar() talkative_check = tk.Checkbutton(options_frame,text = "talkative",variable = talkative_var) talkative_check.grid(row = 4,sticky="nw",padx=2,pady=5) recursion_var = tk.IntVar() recursion_check = tk.Checkbutton(options_frame,text = "recursion",variable = recursion_var) recursion_check.grid(row = 5,sticky="nw",padx=2,pady=5) enter_button = tk.Button(options_frame, text = "Write a grid") enter_button.grid(row = 6,padx=2,pady=30) enter_button.config(bd=2,command = partial(__popup,button_grid)) image = tk.PhotoImage(file = 'icons/help-icon.png') can = tk.Canvas(options_frame,width = 40,height = 40) item = can.create_image(24,24,image = image) can.grid(row = 7) can.bind("<Button-1>",help_option) start_button = tk.Button(win, text="run") start_button.grid(column=1,row=9,pady=5) start_button.config(bd=2,command = partial(__run,button_grid,rec=recursion_var,img=image_var,rm=remove_var,t=talkative_var)) raz_button = tk.Button(win, text="RAZ") raz_button.grid(column=4,row=9) raz_button.config(bd=2,command = partial(__RAZ,button_grid)) quit_button = tk.Button(win, text="exit") quit_button.grid(column=7,row=9) quit_button.config(bd=2,command = back) win.mainloop()
def create(string='0' * 81): """ this function creates the graphical board from a solver. It also launches the event loop. Thus, this is the only function to run to have a functional graphical board. :param string: the sudoku :type string: str :return: None :rtype: NoneType """ global img, win, grid, recursion_check, image_check, remove_check, talkative_check, start_button, enter_button grid = sudoku_grid.make_grid(string) win = tk.Tk() win.title('Sudoku Solver') iconpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), "icons") img = [ tk.PhotoImage(file=os.path.join(iconpath, "0.gif")), tk.PhotoImage(file=os.path.join(iconpath, "1.gif")), tk.PhotoImage(file=os.path.join(iconpath, "2.gif")), tk.PhotoImage(file=os.path.join(iconpath, "3.gif")), tk.PhotoImage(file=os.path.join(iconpath, "4.gif")), tk.PhotoImage(file=os.path.join(iconpath, "5.gif")), tk.PhotoImage(file=os.path.join(iconpath, "6.gif")), tk.PhotoImage(file=os.path.join(iconpath, "7.gif")), tk.PhotoImage(file=os.path.join(iconpath, "8.gif")), tk.PhotoImage(file=os.path.join(iconpath, "9.gif")) ] button_grid = list() for ind_line in range(9): button_grid.insert(ind_line, []) for ind_col in range(9): button = tk.Button(win, padx=0, pady=0, width=30, height=30, image=img[int(string[ind_line * 9 + ind_col])]) button.grid(column=ind_col, row=ind_line) button_grid[ind_line].insert(ind_col, button) button.config( command=partial(__change, button_grid, ind_line, ind_col)) for ind_square in range(9): button_list = sudoku_grid.get_square(button_grid, ind_square) for button in button_list: if ind_square % 2: button.config(bg="grey") else: button.config(bg="white") text = tk.Label(win, text="options:", font="bold 16 italic") text.grid(column=9, row=1) image_var = tk.IntVar() image_check = tk.Checkbutton(win, text="arbre", variable=image_var) image_check.grid(column=9, row=2) remove_var = tk.IntVar() remove_check = tk.Checkbutton(win, text="remove", variable=remove_var) remove_check.grid(column=9, row=3) talkative_var = tk.IntVar() talkative_check = tk.Checkbutton(win, text="talkative", variable=talkative_var) talkative_check.grid(column=9, row=4) recursion_var = tk.IntVar() recursion_check = tk.Checkbutton(win, text="recursion", variable=recursion_var) recursion_check.grid(column=9, row=5) enter_button = tk.Button(win, text="Write a grid") enter_button.grid(column=9, row=6) enter_button.config(command=partial(__popup, button_grid)) start_button = tk.Button(win, text="run") start_button.grid(column=1, row=9) start_button.config(command=partial(__run, button_grid, rec=recursion_var, img=image_var, rm=remove_var, t=talkative_var)) raz_button = tk.Button(win, text="RAZ") raz_button.grid(column=4, row=9) raz_button.config(command=partial(__RAZ, button_grid)) quit_button = tk.Button(win, text="quit") quit_button.grid(column=7, row=9) quit_button.config(command=win.destroy) win.mainloop()