Esempio n. 1
0
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
Esempio n. 2
0
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))
Esempio n. 3
0
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))
Esempio n. 4
0
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()
Esempio n. 5
0
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()
Esempio n. 6
0
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()