Beispiel #1
0
class NEATPanel(Frame):
    def __init__(self, tile_size, Genomes=[]):
        self.root = Tk()
        self.root.geometry("780x720")
        self.root.update()
        self.genoemes_num = len(Genomes)
        self.genoemes = Genomes
        self.tile_num = 5
        self.tile_size = tile_size
        self.entry = Entry(self.root)
        self.entry.grid(row=0, column=4)
        self.root.bind('<Return>', self.hit_enter)

        canvas_main = Canvas(self.root, width=620, height=720)
        canvas_main.grid(row=0, column=0, sticky='news')

        scroll_bar = Scrollbar(self.root,
                               orient="vertical",
                               command=canvas_main.yview)
        scroll_bar.grid(row=0, column=1, sticky='ns')
        canvas_main.configure(yscrollcommand=scroll_bar.set)

        self.frame = Frame(
            self.root,
            width=600,
            height=math.ceil(self.genoemes_num / self.tile_num) * 120)
        canvas_main.create_window((0, 0), window=self.frame, anchor='nw')

        self.canvases = [
            Canvas(self.frame,
                   width=self.tile_size,
                   height=self.tile_size,
                   bg='gray') for _ in range(self.genoemes_num)
        ]

        counter = 0
        for i in range(math.ceil(self.genoemes_num / self.tile_num)):
            for j in range(self.tile_num):
                self.canvases[counter].grid(row=i, column=j, sticky='news')
                if counter == self.genoemes_num - 1:
                    break
                counter += 1

        canvas_main.config(scrollregion=canvas_main.bbox("all"))
        self.frame.update_idletasks()

    def start(self):
        self.root.mainloop()

    def hit_enter(self, event):
        _input = int(self.entry.get())
        #self.canvases[_input].place(x=0,y=0)
        self.canvases[_input].grid(row=0,
                                   column=0,
                                   columnspan=2,
                                   rowspan=2,
                                   padx=5,
                                   pady=5)
        self.canvases[_input].config(width=320, height=320)
        self.frame.update_idletasks()
    def right_frame(parent):
        rf_width = 300
        rf_height = 360
        # right side frame
        frame_right = LabelFrame(
            parent.building_pos_window,
            text="Building Position",
            width=rf_width - 10,
            height=rf_height - 10,
        )

        frame_right.grid_rowconfigure(0, weight=1)
        frame_right.grid_columnconfigure(0, weight=1)
        frame_right.grid_propagate(False)

        canvas_right = Canvas(frame_right)
        canvas_right.grid(row=0, column=0, sticky=N + W)

        # Link a scrollbar to the canvas
        def on_mousewheel(event):
            canvas_right.yview_scroll(int(-1 * (event.delta / 120)), "units")

        def bound_to_mousewheel(event):
            canvas_right.bind_all("<MouseWheel>", on_mousewheel)

        def unbound_to_mousewheel(event):
            canvas_right.unbind_all("<MouseWheel>")

        y_scrollbar = Scrollbar(frame_right,
                                orient="vertical",
                                command=canvas_right.yview)
        y_scrollbar.grid(row=0, column=1, sticky='ns')
        canvas_right.configure(yscrollcommand=y_scrollbar.set)

        inner_frame_right = Frame(canvas_right)
        inner_frame_right.bind('<Enter>', bound_to_mousewheel)
        inner_frame_right.bind('<Leave>', unbound_to_mousewheel)

        canvas_right.create_window((0, 0),
                                   window=inner_frame_right,
                                   anchor='nw')

        idx = 0
        for e_name in BuildingNames:
            building_name_xy_config_frame(
                inner_frame_right, idx, e_name.value,
                parent.bot_building_pos.get(e_name.value, [-1, -1])
                if parent.bot_building_pos is not None else [-1, -1])
            idx = idx + 1

        inner_frame_right.update_idletasks()

        frame_right.config(width=rf_width - 10, height=360 - 10)
        canvas_right.config(width=rf_width - 10,
                            height=360 - 10,
                            scrollregion=canvas_right.bbox("all"))

        frame_right.grid(row=0, column=1, padx=5, pady=5, sticky=N + W)

        return inner_frame_right
Beispiel #3
0
    def information(self):
        ########################################################################
        #                  Information                                         #
        ########################################################################
        # Renvoie les spécialite offerte par l'école en fonction du choix de l'utilisateur

        window = Toplevel(self.root)
        window.resizable(True, True)
        vsb = Scrollbar(window, orient="vertical")
        vsb.grid(row=0, column=1, sticky="ns")
        hsb = Scrollbar(window, orient="horizontal")
        hsb.grid(row=1, column=0, sticky="ew")
        ca = Canvas(window, yscrollcommand=vsb.set, xscrollcommand=hsb.set)
        ca.grid(row=0, column=0, sticky="news")
        vsb.config(command=ca.yview)
        hsb.config(command=ca.xview)
        window.grid_rowconfigure(0, weight=1)
        window.grid_columnconfigure(0, weight=1)
        fr = Frame(ca)

        i=1
        for a in ["Nom","Admission","Region","Alternance","Specialite"]:
            Label(fr, text=a).grid(row=0, column=i)
            i+=2

        if self.choix["specialites"] == None:
            ListeSpe = list(self.specialites.get(0, "end"))
        else:
            ListeSpe = [
                self.specialites.get(i) for i in self.specialites.curselection()
            ]

        if self.choix["alternance"] == None:
            alternance = ["Oui", "Non"]

        else:
            alternance = [self.choix["alternance"][0]]

        ligne = 1
        for ecole in self.ecolesselect.values():
            if ecole["var"].get() == 1:
                for i in [value for (key,value) in self.ecolesselect.items() if value['nom']==ecole['nom'] and value["Spe"] in ListeSpe and value["Alternance"] in alternance ]:
                    j=1
                    for texte in [i["nom"],i["admission"],i["region"],i["Alternance"],i["Spe"]] :
                        a = Entry(fr,width=60)
                        a.insert(0,texte)
                        a.grid(row=ligne, column=j)
                        j+=2

                        a.config(state="disabled")
                        

                    ligne += 1

        ca.create_window(0, 0, window=fr)
        fr.update_idletasks()
        ca.config(scrollregion=ca.bbox("all"))
    def init_gui(self, cim):
        """Make a new tkinter window"""
        root = Tk()
        root.grid_rowconfigure(0, weight=1)
        root.columnconfigure(0, weight=1)
        root.title(cim)
        root.resizable(False, True)
        frame_main = Frame(root)
        frame_main.grid(sticky='news')

        # Create a frame for the canvas with non-zero row&column weights
        frame_canvas = Frame(frame_main)
        frame_canvas.grid(row=0, column=0)
        frame_canvas.grid_rowconfigure(0, weight=1)
        frame_canvas.grid_columnconfigure(0, weight=1)
        # Set grid_propagate to False to allow 5-by-5 buttons resizing later
        frame_canvas.grid_propagate(False)

        # Add a canvas in that frame
        canvas = Canvas(frame_canvas)
        canvas.grid(row=0, column=0)
        canvas.pack(fill="both", expand=True)

        # Link a scrollbar to the canvas
        vsb = Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
        vsb.grid(row=0, column=1, sticky='ns')
        canvas.configure(yscrollcommand=vsb.set)

        # Create a frame to contain the scrollable content
        frame_progress = Frame(canvas)
        canvas.create_window((0, 0), window=frame_progress, anchor='nw')
        self.canvas = canvas
        self.frame_main = frame_main

        for process in self.process_list:
            self.init_new_progressbar(frame_progress,
                                      p_length=300,
                                      p_process=process)
        frame_progress.update_idletasks()
        p = self.process_list[0]
        frame_width = p['task_label'].winfo_width(
        ) + p['progressbar'].winfo_width() + p['status_label'].winfo_width()
        rows = 20 if len(self.process_list) > 20 else len(self.process_list)
        frame_height = (p['progressbar'].winfo_height() * rows)
        frame_canvas.config(width=frame_width + vsb.winfo_width(),
                            height=frame_height)
        canvas.config(width=frame_width + vsb.winfo_width(),
                      height=frame_height)
        canvas.config(scrollregion=canvas.bbox("all"))
        canvas.update()

        self.frame_main.bind("<Configure>", self.configure)

        return root
Beispiel #5
0
 def __init__(self,
              parent: tk.Frame = None,
              interval=20,
              linenum=10,
              save=True,
              drag=True,
              adaptation=True,
              lengthx=20000):
     Canvas.__init__(self, parent, bg='#345', closeenough=2)
     parent.update_idletasks()
     self.pack(fill=tk.BOTH, expand=True)
     self.update_idletasks()
     self.hScroll = Scrollbar(parent,
                              orient='horizontal',
                              command=self.hScrolled)
     self.hScroll.pack(side=tk.BOTTOM, fill=tk.X)
     self.configure(yscrollcommand=None,
                    xscrollcommand=self._canvashScrolled)
     self.bind("<Button-1>", self.__mouseDown)
     self.bind("<MouseWheel>", self.__mouseScale)
     self.bind("<B1-Motion>", self.__mouseDownMove)
     self.bind("<B1-ButtonRelease>", self.__mouseUp)
     self.bind("<Enter>", self.__mouseEnter)
     self.bind("<Leave>", self.__mouseLeave)
     self.bind("<Motion>", self.__mouseHoverMove)
     self["xscrollincrement"] = 1
     self["yscrollincrement"] = 1
     self.__dataList = []
     self._rulerdata = [0] * linenum
     self.x = 0
     self.scrollx = 3.0
     self.offsety = 0
     self._interval = interval  # main loop interval to handle input data
     self._lengthx = lengthx  # scrollregion x
     self._rulerOn = False
     self._dragOn = drag  # enable mouse move items
     self._gridOn = True  # draw grid lines
     self._loopOn = True
     self._tipOn = False
     self._adaptation = adaptation
     self._ruler = None
     self._rulerX = -1
     self._save = save  # 保存数据
     self._dataWriter = None  # 数据保存writer
     self._datafile = ''  # 保存文件名称
     self._scrollOn = False
     self._lineNum = linenum
     self._firststart = True
     # this data is used to keep track of an item being dragged
     # in this app, only vertical position
     self._drag_data = {"sx": 0, "sy": 0, "x": 0, "y": 0, "item": None}
     self._lines = []
     self.after(200, self.__initCanvas)
Beispiel #6
0
    def config_frame(self):
        frame_canvas = LabelFrame(self,
                                  text='Config',
                                  width=self.windows_size[0],
                                  height=self.windows_size[1] - 200
                                  )
        frame_canvas.grid_rowconfigure(0, weight=1)
        frame_canvas.grid_columnconfigure(0, weight=1)
        frame_canvas.grid_propagate(False)

        # Add a canvas in that frame
        canvas = Canvas(frame_canvas)
        canvas.grid(row=0, column=0, sticky=N+W)

        # Link a scrollbar to the canvas

        def on_mousewheel(event):
            canvas.yview_scroll(int(-1*(event.delta/120)), "units")

        def bound_to_mousewheel(event):
            canvas.bind_all("<MouseWheel>", on_mousewheel)

        def unbound_to_mousewheel(event):
            canvas.unbind_all("<MouseWheel>")

        y_scrollbar = Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
        y_scrollbar.grid(row=0, column=1, sticky='ns')
        canvas.configure(yscrollcommand=y_scrollbar.set)

        inner_frame = Frame(canvas)
        inner_frame.bind('<Enter>', bound_to_mousewheel)
        inner_frame.bind('<Leave>', unbound_to_mousewheel)

        canvas.create_window((0, 0), window=inner_frame, anchor='nw')

        for i in range(len(atf.bot_config_title_fns)):
            title_fns, sub_fns = atf.bot_config_title_fns[i]
            check = section_frame(
                self,
                inner_frame,
                title_fns,
                sub_fns
            )
            check.grid(row=i, column=0, sticky=N + W)

        inner_frame.update_idletasks()

        frame_canvas.config(width=self.windows_size[0] - 20, height=self.windows_size[1] - 350)
        canvas.config(width=self.windows_size[0] - 20, height=self.windows_size[1] - 350, scrollregion=canvas.bbox("all"))

        return frame_canvas
Beispiel #7
0
        def recherche():
            global accept
            global ch
            choix = ch
            print(choix)
            accept = 0
            framemodif.destroy()
            cnv2.delete(ALL)
            mois = t.get()
            annee = t2.get()
            couleurfrm = "#99512B"
            vScroll2.grid(row=0, column=1, sticky='ns')
            cnv2.configure(yscrollcommand=vScroll2.set)
            frm2 = Frame(cnv2, bg=couleurfrm)
            cnv2.create_window(0, 0, window=frm2, anchor='nw')
            n = 0
            n2 = 0
            n3 = 0
            for file in glob.glob("categories/%s/%sfact%s/%s/*.jpg" %
                                  (choix, annee, choix, mois)):
                b = os.path.splitext(os.path.basename(file))[0]
                verif = b[-1]
                if verif == "z":
                    btext = b.replace("z", "")
                    photo = ImageTk.PhotoImage(
                        file="categories/%s/%sfact%s/%s/%s.jpg" %
                        (choix, anneetoday, choix, mois, b))
                    bouton = Button(frm2,
                                    compound=TOP,
                                    height=150,
                                    text="%s" % btext,
                                    width=150,
                                    image=photo,
                                    command=lambda i=btext: choose(i))
                    dic['photo%s' %
                        n3] = photo  ## on sauvegarde dans le dico l'instance
                    bouton.grid(row=n, column=n2, padx=20, pady=10)
                    n2 = n2 + 1
                    n3 = n3 + 1
                    if n2 == 4:
                        n2 = 0
                        n = n + 1
            frm2.update_idletasks()
            cnv2.configure(scrollregion=(0, 0, frm2.winfo_width(),
                                         frm2.winfo_height()))

            def choose(choix2):
                os.startfile("categories\%s\%sfact%s\%s\%s.jpg" %
                             (choix, anneetoday, choix, mois, choix2))
Beispiel #8
0
    def draw_table(self):
        # clear the canvas of past tables
        self.tablecanvas.delete("all")

        # create the frame to hold the table
        frame = Frame(self.tablecanvas)
        frame.rowconfigure(0, weight=1)
        frame.columnconfigure(0, weight=1)

        # PACE HOLDER FOR REAL TABLE GENERATION
        for i in range(25):
            Button(frame, text=i).grid(row=i, column=i)

        # make the window that holds the frame
        self.tablecanvas.create_window(0, 0, window=frame, anchor=N + W)
        frame.update_idletasks()

        # update the scrollable area to the new width
        self.tablecanvas.config(scrollregion=self.tablecanvas.bbox("all"))
    def ow_frames(input_criteria,
                  opened_files,
                  data_frames,
                  auto_open_var,
                  output_type,
                  file_list,
                  root2=False,
                  func=0,
                  file_name='default'):
        """
        Search Open Files by Input Criteria and output file
        :param input_criteria: Search Column and Search Item(s)
        :param opened_files: List of opened files with Checkbutton variables
        :param data_frames: list of open files(classes)
        :param auto_open_var: Main window Checkbutton variable for Auto-Open
        :param output_type: type of output - set to xlsx for a while
        :param file_list: Search Order List
        """
        def get_checked_l():
            checked_list = []
            for file in file_list:  # Iterate through DataFrames using i as index
                ind = file_list.index(file)
                if opened_files[ind][2].get() == 1:
                    checked_list.append(file)
            return checked_list

        start = time.time()
        new_output = []  # Search results per DataFrame
        if not _test:
            root = Frame(root2)
            progress = Progressbar(root,
                                   orient=HORIZONTAL,
                                   length=300,
                                   mode='determinate')
            progress.pack(fill=X)
            v = StringVar()
            Label(root, textvariable=v).pack()
            root.pack()

        if func == 0 or func == 3:
            if func == 0:
                print('Searching:\n' + input_criteria[1][1].get())
                search_column = (input_criteria[0][1].get()).strip()
                out_d_and_n, zeros_dict, font_type_size, col_width, dec_rules,\
                dec_place = GenFuncs.get_out_opts(input_criteria, search_column,output_type)  # Load Settings
            elif func == 3:
                out_d_and_n, zeros_dict, font_type_size, col_width, dec_rules,\
                dec_place = GenFuncs.get_out_opts(input_criteria, input_criteria[0],output_type, func=1, file_name=file_name)  # Load Settings

            checked_l = get_checked_l()

            for file in checked_l:
                ind = file_list.index(file)
                if not _test:
                    progress_bar_ind = checked_l.index(file)
                    progress['value'] = ((
                        (progress_bar_ind + 1) / len(checked_l)) * 100) / 2
                    v.set("Searching : " + GenFuncs.strip_dir(file))
                    root.update_idletasks()
                if func != 3:
                    results = data_frames[ind].search_col(
                        search_column, input_criteria[1][1].get(),
                        zeros_dict)  # <-need to move
                else:
                    results = data_frames[ind].search_col(
                        input_criteria[0], input_criteria[1], zeros_dict)
                try:
                    if not results.empty:
                        new_output.append(results)
                except AttributeError:
                    pass
        else:
            new_new_output = opened_files
            output_type = 'xlsx'
            out_d_and_n, zeros_dict, font_type_size, \
            col_width, dec_rules, dec_place = GenFuncs.get_out_opts("", "",output_type, func=1, file_name=file_name)  # Load Settings

        output_directory = os.path.dirname(out_d_and_n)

        for FP_out in os.listdir(
                output_directory):  # Clean output folder of past search items
            if FP_out.endswith("FP_out.xlsx"):
                try:
                    os.remove(os.path.join(output_directory, FP_out))
                except PermissionError:
                    pass

        if dec_place != False:
            dec_var = '%.' + str(dec_place) + 'f'
        else:
            dec_var = "%.2f"
        if not _test:
            v.set("Formatting Output")
            root.update_idletasks()
        try:
            if func == 0 or func == 3:
                try:
                    new_new_output = pd.concat(new_output,
                                               axis=0,
                                               sort=False,
                                               ignore_index=True)
                except:
                    print("No results")
                    if not _test:
                        progress.destroy()
                        v.set("No results")
                        root.update_idletasks()
                        time.sleep(2)
                        root.destroy()
                    return

            #var_file = shelve.open(os.path.join(os.path.expanduser('~'),'var_file'))
            #try:
            #    plug_dicts = var_file['plug_lists']
            #    var_file.close()
            #    for key, value in plug_dicts.items():
            #        if value[0] == 1:
            #            new_new_output = value[1].run(new_new_output)
            #except KeyError:
            #    var_file.close()
            #print('fail retrieve_info')

            cols_index = []
            for col in new_new_output:
                cols_index.append(col)
            if output_type == 'csv':
                new_new_output.to_csv(out_d_and_n, index=False)
            elif output_type == 'xlsx':
                writer_orig = pd.ExcelWriter(out_d_and_n, engine='xlsxwriter')
                new_new_output.to_excel(writer_orig,
                                        index=False,
                                        sheet_name='SearchOutput',
                                        float_format=dec_var)
                workbook = writer_orig.book
                worksheet = writer_orig.sheets['SearchOutput']
                size = 10
                f_rule_cnt = len(font_type_size) + len(col_width) + len(
                    dec_rules)
                crnt_rule = 0
                if font_type_size != {}:  # Set Global Font Size / Type
                    try:
                        size = int(list(font_type_size.values())[0])
                        if size != False:
                            workbook.formats[0].set_font_size(size)
                        if list(font_type_size.keys())[0] != False:
                            workbook.formats[0].set_font_name(
                                list(font_type_size.keys())[0])
                        if not _test:
                            progress['value'] = ((
                                (crnt_rule / f_rule_cnt) * 100) / 2) + 50
                            crnt_rule += 1
                            v.set(v.get() + ".")
                            root.update_idletasks()
                    except IndexError:
                        pass
                if len(col_width) > 0:  # Set Column / Widths
                    for rule in col_width.items():
                        worksheet.set_column(rule[0], int(rule[1]))
                        if not _test:
                            progress['value'] = ((
                                (crnt_rule / f_rule_cnt) * 100) / 2) + 50
                            crnt_rule += 1
                            v.set(v.get() + ".")
                            root.update_idletasks()
                try:
                    writer_orig.save()
                except Exception as e:
                    print(e)
                    print("File with same criteria already open?")
            if auto_open_var.get() == 1:
                try:
                    if platform == "linux" or platform == "linux2":
                        opener = "open" if sys.platform == "darwin" else "xdg-open"
                        subprocess.call([opener, out_d_and_n])
                    else:
                        os.startfile(out_d_and_n, 'open')
                except:
                    print(
                        'Error while trying to open application\nPlease set default xlsx application'
                    )
                end = time.time()
                print('-------' + str(end - start) + '-------')
            else:
                end = time.time()
                print('-------' + str(end - start) + '-------')
                print('done')
            if not _test:
                root.destroy()

        except PermissionError as e:
            print(str(e)[:28] + ": Close File Before Searching")
Beispiel #10
0
class Game(ABC):
    def __init__(self):
        self.frame = Frame(window, bg=bgc)
        self.start = 0
        self.end = 0
        self.qstart = 0
        self.qend = 0
        self.questions = self.generate()
        self.progress = 0
        self.cq = self.questions[self.progress]
        self.sv = tk.StringVar()
        self.start_questions()

    def factors(self, n):
        # chain.from_iterable takes (x, y) as input and returns x y
        return(set(chain.from_iterable(((self.check(i, n//i) for i in range(
            2, min(int(n**0.5) + 1, 13)) if n % i == 0)))))

    def format_percentage(self, v):
        p = v["first"]*100
        if p % 1 != 0.5:
            p = round(p)
        return ("{first}% of {second}").format(first=p, second=v["second"])

    def check(self, a, b):
        if 1 < b < 13:
            return (a, b)
        else:
            return(a, a)

    @abstractmethod
    def generate(self):
        pass

    def create_grid(self):
        self.ans.config(justify=tk.RIGHT)
        self.first.config(anchor="e", text=self.cq["first"])
        self.second.config(text=self.cq["second"])
        self.op.config(text=self.cq["op"])
        self.iframe.columnconfigure(0, weight=0)
        self.iframe.columnconfigure(1, weight=0)

    def create_one_line(self):
        self.ans.config(justify=tk.CENTER)
        self.iframe.columnconfigure(0, weight=1)
        self.iframe.columnconfigure(1, weight=1)
        self.first.config(anchor="center", text=self.cq["format"])
        self.second.config(text="")
        self.op.config(text="")

    def start_questions(self):
        # self.show_stats()
        self.frame.grid(row=0, column=0, sticky="news")
        for i in range(3):
            self.frame.rowconfigure(i, weight=1)
            self.frame.columnconfigure(i, weight=1)
        self.progressbar = Progressbar(self.frame, orient=tk.HORIZONTAL,
                                       length=200, mode="determinate", value=0)
        self.progressbar.grid(row=0, column=1, sticky="ew")
        Button(self.frame, text="x", anchor="se", bg=bgc, fg=fc, bd=0,
               activebackground=bgc, command=main_menu,
               font=(font.Font(family="Consolas", size=25))
               ).grid(row=0, column=0, sticky="nw")
        HoverButton(self.frame, command=lambda: self.next_question(True),
                    text="skip").grid(row=2, column=1, sticky="new")

        self.iframe = Frame(self.frame, bg=bgc)
        self.first = Label(self.iframe, font=qF, anchor="e", bg=bgc, fg=fc)
        self.second = Label(self.iframe, font=qF, anchor="e", bg=bgc, fg=fc)
        self.op = Label(self.iframe, font=qF, anchor="e", bg=bgc, fg=fc)
        self.ans = Entry(self.iframe, font=qF, bg=bgc, fg=fc, width=10,
                         textvariable=self.sv, insertbackground=fc, bd=0)

        self.iframe.grid(row=1, column=1, sticky="news")
        self.iframe.rowconfigure(0, weight=1)
        self.iframe.rowconfigure(4, weight=1)
        self.ans.delete(0, "end")
        self.sv.trace_add("write", self.check_value)

        if self.cq["op"] not in normal_op:
            self.create_one_line()
        else:
            self.create_grid()

        self.first.grid(row=1, column=0, columnspan=2, sticky="news")
        self.second.grid(row=2, column=1, sticky="news")
        self.op.grid(row=2, column=0, sticky="news")
        self.ans.grid(row=3, column=0, columnspan=2, sticky="news")
        self.ans.focus_set()

        self.start = time()
        self.qstart = time()

    def check_value(self, name, index, mode):
        if self.sv.get() == self.cq["answer"]:
            window.after(150, self.next_question)

    def next_question(self, skip=False):
            self.qend = time()
            if (skip):
                self.cq["time"] = "SKIP"
            else:
                self.cq["time"] = self.qend - self.qstart
            self.progress += 1
            if self.progress < len(self.questions):
                self.cq = self.questions[self.progress]
                self.progressbar["value"] = 100*(
                    self.progress/len(self.questions)
                )
                if self.cq["op"] not in normal_op:
                    self.create_one_line()
                else:
                    self.create_grid()
                self.ans.delete(0, "end")
                self.qstart = time()
            else:
                self.end = time()
                self.show_stats()

    def show_stats(self):
            self.frame.destroy()
            self.frame = Frame(window, bg=bgc)
            self.frame.grid(row=0, column=0, sticky="news")
            self.frame.rowconfigure(0, weight=1)
            self.frame.rowconfigure(4, weight=1)
            self.frame.columnconfigure(0, weight=1)
            self.frame.columnconfigure(3, weight=1)
            lblFrame = Frame(self.frame, bg=bgc)
            # lblFrame.grid_propagate(False)
            # lblFrame.rowconfigure(0, weight=1)
            # lblFrame.rowconfigure(3, weight=1)
            # lblFrame.columnconfigure(0, weight=1)
            # lblFrame.columnconfigure(2, weight=1)
            lblFrame.grid(row=2, column=2, sticky="news")
            diff = self.end-self.start
            Label(lblFrame, text=("Time taken: {0:0.1f}s".format(diff)),
                  font=f, anchor="w", bg=bgc, fg=fc
                  ).grid(row=0, column=0, padx=20, pady=(30, 0), sticky="news")

            avg = c = 0
            for q in self.questions:
                if q["time"] != "SKIP":
                    avg += q["time"]
                    c += 1
            if c != 0:
                avg /= c
            else:
                avg = 0
            # Label(lblFrame, text="Avg time taken: {0:0.1f}s".format(avg),
            # font=f, anchor="w", bg=bgc, fg=fc).grid(row=1, column=0, padx=20,
            # sticky="news")
            HoverButton(self.frame, text="choose level", command=main_menu
                        ).grid(row=3, column=2, padx=10, pady=20, sticky="ew")
            # play again button is added on in respective inherited methods

            graphFrame = Frame(self.frame, bg=bgc)
            graphFrame.grid(row=1, column=2, sticky="news")
            # graphFrame.grid_propagate(False)
            graphCanvas = Canvas(graphFrame, bg=bgc, highlightthickness=0)
            graphCanvas.grid()
            graph = SpeedGraph(graphCanvas, 50, 50, 250, 250, 15, avg)
            graphCanvas.create_text(
                150, 25, text="Average time taken", fill=tbgc,
                font=(font.Font(family="Consolas", size=20))
            )

            oframe = Frame(
                self.frame, bg=sbgc, bd=5, relief=tk.GROOVE, padx=10
            )
            oframe.grid(row=1, column=1, rowspan=2, sticky='nw')
            oframe.grid_rowconfigure(0, weight=1)
            oframe.grid_columnconfigure(0, weight=1)
            # prevents children of the frame resizing frame
            oframe.grid_propagate(False)

            # Add a canvas in that frame
            canvas = Canvas(oframe, bg=sbgc, highlightbackground=sbgc)
            canvas.grid(row=0, column=0, sticky="news", padx=20, pady=20)

            # Link a scrollbar to the canvas
            vsb = Scrollbar(oframe, orient=tk.VERTICAL, command=canvas.yview)
            vsb.grid(row=0, column=1, sticky='ns', padx=5, pady=5)
            canvas.configure(yscrollcommand=vsb.set)

            hsb = Scrollbar(oframe, orient=tk.HORIZONTAL, command=canvas.xview)
            hsb.grid(row=1, column=0, sticky="ew", padx=5, pady=5)
            canvas.configure(xscrollcommand=hsb.set)

            # Create a frame to contain the results
            self.iframe = Frame(canvas, bg=sbgc)
            canvas.create_window((0, 0), window=self.iframe, anchor='nw')

            Result(self.iframe, text="Question"
                   ).grid(row=0, column=0, padx=5, sticky="news")
            Result(self.iframe, text="Answer"
                   ).grid(row=0, column=1, padx=5, sticky="news")
            Result(self.iframe, text="Time"
                   ).grid(row=0, column=2, padx=5, sticky="news")
            global normal_op
            for c, v in enumerate(self.questions):
                if v["op"] in normal_op:
                    Result(self.iframe, text=v["format"]
                           ).grid(row=c+1, column=0, padx=5, sticky="news")
                else:
                    Result(self.iframe, text=v["format"]
                           ).grid(row=c+1, column=0, padx=5, sticky="news")

                Result(self.iframe, text=v["answer"]
                       ).grid(row=c+1, column=1, padx=5, sticky="news")
                if v["time"] == "SKIP":
                    Result(self.iframe, text=v["time"]
                           ).grid(row=c+1, column=2, padx=5, sticky="news")
                else:
                    Result(self.iframe, text=("{0:0.1f} sec").format(v["time"])
                           ).grid(row=c+1, column=2, padx=5, sticky="news")

            self.iframe.update_idletasks()  # NEED THIS for BBOX INFO
            oframe.config(width=400, height=400)
            canvas.config(scrollregion=canvas.bbox("all"))
Beispiel #11
0
    feeds = []
print(liste)
root=Tk()
root.resizable(False, False)###on peut pas modifier la taille de la fenetre
couleurprin="#DEB887"
couleursec="#FEFEE0"
couleurfrm="#99512B"
frameprincipale = Frame(root,width=1000,height=600,bg=couleurprin)###on cree une frame 1000*600 (taille de la fenetre)
frameprincipale.pack()
frameprincipale.pack_propagate(0)### taille de la frame fixe
frame=Frame(frameprincipale)
frame.pack(side=LEFT)
frameshowrss=Frame(frame)
frameshowrss.grid(row=0, column=0)
cnv = Canvas(frameshowrss,bg=couleursec,width=1000,height=600)
cnv.grid(row=0, column=1)
vScroll = Scrollbar(frameshowrss, orient=VERTICAL, command=cnv.yview)
vScroll.grid(row=0, column=0, sticky='ns')
cnv.configure(yscrollcommand=vScroll.set)
frm = Frame(cnv,bg=couleurfrm)
cnv.create_window(0, 0, window=frm, anchor='nw')
for elment,journal,url in liste:
    c=Button(frm,text="%s - %s"%(elment,journal),command=lambda i=url:choose(i,))
    c.pack(side=TOP)
    def choose(url):
        webbrowser.open(url)
frm.update_idletasks()
cnv.configure(scrollregion=(0, 0, frm.winfo_width(), frm.winfo_height()))

root.mainloop()
Beispiel #12
0
def facture():
    def retour():
        frameshowfracture.destroy()
        framecategorie.destroy()
        bmenu.destroy()
        menu()

    bajout.destroy()
    bfacture.destroy()
    frameshowfracture = Frame(frameprincipale, bg=couleursec)
    frameshowfracture.pack(side=RIGHT, fill=BOTH, expand=1)
    framecategorie = Frame(frameprincipale, bg=couleurfrm)
    framecategorie.pack(side=LEFT)
    framefactureshow = Frame(frameshowfracture, bg=couleursec)
    framefactureshow.grid()
    cnv2 = Canvas(framefactureshow, bg=couleursec, width=805, height=600)
    cnv2.grid(row=0, column=0)
    bmenu = Button(framecategorie, text="menuprincipal", command=retour)
    bmenu.grid()
    framefacture = Frame(framecategorie, bg=couleursec)
    framefacture.grid()
    cnv = Canvas(framefacture, bg=couleursec, width=150, height=550)
    cnv.grid(row=0, column=1)
    vScroll = Scrollbar(framefacture, orient=VERTICAL, command=cnv.yview)
    vScroll.grid(row=0, column=0, sticky='ns')
    cnv.configure(yscrollcommand=vScroll.set)
    frm = Frame(cnv, bg=couleurfrm)
    cnv.create_window(0, 0, window=frm, anchor='nw')
    n = 0
    n2 = 0
    for categor in categorieini:  ###cree bouton de la liste des categorie
        c = Button(frm,
                   text=categor,
                   width=20,
                   height=5,
                   bg=couleursec,
                   command=lambda i=categor: ch(i)).grid(pady=10,
                                                         row=n,
                                                         column=n2)
        n = n + 1
    frm.update_idletasks()
    cnv.configure(scrollregion=(0, 0, frm.winfo_width(), frm.winfo_height()))
    vScroll2 = Scrollbar(framefactureshow, orient=VERTICAL, command=cnv2.yview)

    def ch(choix):  ###fonction appelée après clique sur bouton
        global accept
        global ch
        ch = choix

        def recherche():
            global accept
            global ch
            choix = ch
            print(choix)
            accept = 0
            framemodif.destroy()
            cnv2.delete(ALL)
            mois = t.get()
            annee = t2.get()
            couleurfrm = "#99512B"
            vScroll2.grid(row=0, column=1, sticky='ns')
            cnv2.configure(yscrollcommand=vScroll2.set)
            frm2 = Frame(cnv2, bg=couleurfrm)
            cnv2.create_window(0, 0, window=frm2, anchor='nw')
            n = 0
            n2 = 0
            n3 = 0
            for file in glob.glob("categories/%s/%sfact%s/%s/*.jpg" %
                                  (choix, annee, choix, mois)):
                b = os.path.splitext(os.path.basename(file))[0]
                verif = b[-1]
                if verif == "z":
                    btext = b.replace("z", "")
                    photo = ImageTk.PhotoImage(
                        file="categories/%s/%sfact%s/%s/%s.jpg" %
                        (choix, anneetoday, choix, mois, b))
                    bouton = Button(frm2,
                                    compound=TOP,
                                    height=150,
                                    text="%s" % btext,
                                    width=150,
                                    image=photo,
                                    command=lambda i=btext: choose(i))
                    dic['photo%s' %
                        n3] = photo  ## on sauvegarde dans le dico l'instance
                    bouton.grid(row=n, column=n2, padx=20, pady=10)
                    n2 = n2 + 1
                    n3 = n3 + 1
                    if n2 == 4:
                        n2 = 0
                        n = n + 1
            frm2.update_idletasks()
            cnv2.configure(scrollregion=(0, 0, frm2.winfo_width(),
                                         frm2.winfo_height()))

            def choose(choix2):
                os.startfile("categories\%s\%sfact%s\%s\%s.jpg" %
                             (choix, anneetoday, choix, mois, choix2))

        vScroll2.grid_forget()
        if accept == 0:
            framemodif = Frame(cnv2)
            framemodif.pack(padx=50, pady=250)
            iframemois = Frame(framemodif, bd=2,
                               relief=RIDGE)  ###frame qui permet ajout du mois
            Label(iframemois, text='entrer le mois :').pack(
                side=LEFT,
                padx=5)  ###label qui indique ce que doit faire l'utilisateur
            t = StringVar(
            )  ###on indique la variable qui va prendre la valeur de ce que va rentrer l'utilisateur
            Entry(iframemois, textvariable=t, bg='white').pack(
                side=LEFT, padx=5
            )  ###on place la case qui permet a l'utilisateur d'ecrire
            iframemois.pack(expand=1, fill=X, pady=10, padx=5)
            iframeannee = Frame(
                framemodif, bd=2,
                relief=RIDGE)  ###frame qui permet ajout de l'annee
            Label(iframeannee, text="entrer l'annee :").pack(side=LEFT, padx=5)
            t2 = StringVar(
            )  ###on indique la variable qui va prendre la valeur de ce que va rentrer l'utilisateur
            Entry(iframeannee, textvariable=t2, bg='white').pack(
                side=LEFT, padx=5
            )  ###on place la case qui permet a l'utilisateur d'ecrire
            iframeannee.pack(expand=1, fill=X, pady=10, padx=5)
            button1 = Button(
                framemodif, text="rechercher",
                command=recherche)  ###le bouton qui appelle fonction recherche
            button1.pack()
            accept = 1
Beispiel #13
0
def ajout():
    def retour():
        frameshowfracture.destroy()
        framecategorie.destroy()
        bmenu.destroy()
        menu()

    def ajouter():
        global ch
        try:
            choix = ch
            mois = t.get()
            annee = t2.get()
            for infile in glob.glob("ajout facture/*.jpg"):
                size = 128, 128
                file, ext = os.path.splitext(infile)
                im = Image.open(infile)
                im.thumbnail(size, Image.ANTIALIAS)
                im.save(infile + "z.jpg", "JPEG")
            for file in glob.glob("ajout facture/*.jpg"):
                c = os.path.basename(file)
                shutil.copy(
                    "ajout facture\%s" % c, "categories\%s\%sfact%s\%s\%s" %
                    (choix, annee, choix, mois, c))
                os.remove("ajout facture\%s" % c)
            retour()
        except:
            problem.set("imposssible d'ajouter la facture")

    bajout.destroy()
    bfacture.destroy()
    frameshowfracture = Frame(frameprincipale, bg=couleursec)
    frameshowfracture.pack(side=RIGHT, fill=BOTH, expand=1)
    framecategorie = Frame(frameprincipale, bg=couleurfrm)
    framecategorie.pack(side=LEFT)
    frameajout = Frame(frameshowfracture, bg=couleursec)
    frameajout.pack()
    label1 = Label(
        frameajout,
        text=
        "_mettre la facture scanner dans le dossier ajout facture(format en jpg \n_choisissez la categorie ainsi que le mois et l'année \n_cliquez sur ajouter"
    )
    label1.grid()
    categorieini = numpy.load(
        "categories/categorieini.npy")  ###on amene la liste des categories
    categorieini = categorieini.tolist()
    frameboutondep = Frame(frameajout, bg=couleursec)
    frameboutondep.grid()
    cnv = Canvas(frameboutondep, bg=couleursec, width=600, height=100)
    cnv.grid(row=0, column=0)
    hScroll = Scrollbar(frameboutondep, orient=HORIZONTAL, command=cnv.xview)
    hScroll.grid(row=1, column=0, sticky='we')
    cnv.configure(xscrollcommand=hScroll.set)
    frm = Frame(cnv, bg=couleurfrm)
    cnv.create_window(0, 0, window=frm, anchor='nw')
    for categor in categorieini:  ###cree bouton de la liste des categorie
        c = Button(frm,
                   text=categor,
                   width=10,
                   height=5,
                   bg=couleursec,
                   command=lambda i=categor: ch(i))
        c.pack(side=LEFT, padx=10)  ###plac
    frm.update_idletasks()
    cnv.configure(scrollregion=(0, 0, frm.winfo_width(), frm.winfo_height()))

    def ch(choix):  ###fonction appelé apres clique sur bouton
        global ch
        ch = choix
        cho.set("vous avez choisie la categorie %s" % choix)
        problem.set("")

    cho = StringVar()
    label2 = Label(frameajout, textvariable=cho, bg=couleursec)
    label2.grid()
    problem = StringVar()
    label3 = Label(frameajout, textvariable=problem, bg=couleursec)
    label3.grid()
    framemodif = Frame(frameajout)
    framemodif.grid()
    iframemois = Frame(framemodif, bd=2,
                       relief=RIDGE)  ###frame qui permet ajout du mois
    Label(iframemois, text='entrer le mois :').pack(
        side=LEFT,
        padx=5)  ###label qui indique ce que doit faire l'utilisateur
    t = StringVar(
    )  ###on indique la variable qui va prendre la valeur de ce que va rentrer l'utilisateur
    Entry(iframemois, textvariable=t, bg='white').pack(
        side=LEFT,
        padx=5)  ###on place la case qui permet a l'utilisateur d'ecrire
    iframemois.pack(expand=1, fill=X, pady=10, padx=5)
    iframeannee = Frame(framemodif, bd=2,
                        relief=RIDGE)  ###frame qui permet ajout de l'annee
    Label(iframeannee, text="entrer l'annee :").pack(side=LEFT, padx=5)
    t2 = StringVar(
    )  ###on indique la variable qui va prendre la valeur de ce que va rentrer l'utilisateur
    Entry(iframeannee, textvariable=t2, bg='white').pack(
        side=LEFT,
        padx=5)  ###on place la case qui permet a l'utilisateur d'ecrire
    iframeannee.pack(expand=1, fill=X, pady=10, padx=5)
    button1 = Button(
        framemodif, text="ajouter",
        command=ajouter)  ###le bouton qui appelle fonction recherche
    button1.pack()
    bmenu = Button(frameshowfracture, text="menuprincipal", command=retour)
    bmenu.pack(side=TOP, pady=50)
Beispiel #14
0
class GameGrid(Frame):
    def __init__(self):
        # Frame.__init__(self)
        self.score = 0
        self.game = Frame()
        self.game.grid()
        self.game.master.title('2048')
        # self.master.bind("<Key>", self.key_down)

        # self.gamelogic = gamelogic
        self.game.commands = {
            c.KEY_UP: logic.up,
            c.KEY_DOWN: logic.down,
            c.KEY_LEFT: logic.left,
            c.KEY_RIGHT: logic.right,
            c.KEY_UP_ALT: logic.up,
            c.KEY_DOWN_ALT: logic.down,
            c.KEY_LEFT_ALT: logic.left,
            c.KEY_RIGHT_ALT: logic.right,
            c.KEY_H: logic.left,
            c.KEY_L: logic.right,
            c.KEY_K: logic.up,
            c.KEY_J: logic.down
        }

        self.game.grid_cells = []
        self.init_grid(self.game)
        self.init_matrix()
        self.update_grid_cells(self.game)

    def render(self):

        self.game.update_idletasks()
        self.game.update()
        time.sleep(0.01)

        time.sleep(0.01)

    def init_grid(self, game):
        background = Frame(game,
                           bg=c.BACKGROUND_COLOR_GAME,
                           width=c.SIZE,
                           height=c.SIZE)
        background.grid()

        for i in range(c.GRID_LEN):
            grid_row = []
            for j in range(c.GRID_LEN):
                cell = Frame(background,
                             bg=c.BACKGROUND_COLOR_CELL_EMPTY,
                             width=c.SIZE / c.GRID_LEN,
                             height=c.SIZE / c.GRID_LEN)
                cell.grid(row=i,
                          column=j,
                          padx=c.GRID_PADDING,
                          pady=c.GRID_PADDING)
                t = Label(master=cell,
                          text="",
                          bg=c.BACKGROUND_COLOR_CELL_EMPTY,
                          justify=CENTER,
                          font=c.FONT,
                          width=5,
                          height=2)
                t.grid()
                grid_row.append(t)

            game.grid_cells.append(grid_row)

    def gen(self):
        return random.randint(0, c.GRID_LEN - 1)

    def init_matrix(self):
        self.matrix = logic.new_game(c.GRID_LEN)
        self.history_matrixs = list()
        self.matrix = logic.add_two(self.matrix)
        self.matrix = logic.add_two(self.matrix)

    def update_grid_cells(self, game):
        for i in range(c.GRID_LEN):
            for j in range(c.GRID_LEN):
                new_number = self.matrix[i][j]
                if new_number == 0:
                    game.grid_cells[i][j].configure(
                        text="", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
                else:
                    game.grid_cells[i][j].configure(
                        text=str(new_number),
                        bg=c.BACKGROUND_COLOR_DICT[new_number],
                        fg=c.CELL_COLOR_DICT[new_number])
        game.update_idletasks()

    def num_actions_available(self):
        return 4

    def get_state(self):
        flat = np.array(self.matrix).flatten().astype(np.float32())
        return torch.from_numpy(flat)

    def key_down(self, event):
        key = event
        game_done = False
        game_result = False
        temp = 0
        current_state = self.matrix

        if key == c.KEY_BACK and len(self.history_matrixs) > 1:
            self.matrix = self.history_matrixs.pop()
            self.update_grid_cells()
            print('back on step total step:', len(self.history_matrixs))

        elif key in self.game.commands:
            self.matrix, done = self.game.commands[key](self.matrix)

            if done:
                self.matrix = logic.add_two(self.matrix)
                # record last move
                self.history_matrixs.append(self.matrix)
                self.update_grid_cells(self.game)

                done = False
                if logic.game_state(self.matrix) == 'win':
                    game_done = True
                    game_result = True
                    self.game.grid_cells[1][1].configure(
                        text="You", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
                    self.game.grid_cells[1][2].configure(
                        text="Win!", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
                if logic.game_state(self.matrix) == 'lose':
                    game_done = True
                    game_result = False
                    self.game.grid_cells[1][1].configure(
                        text="You", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
                    self.game.grid_cells[1][2].configure(
                        text="Lose!", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
        if (game_done and game_result):
            self.score = sum(np.array(self.matrix).flatten())
        elif (game_done and not (game_result)):
            self.score = -1 * sum(np.array(self.matrix).flatten())
        else:
            if (self.score != sum(np.array(self.matrix).flatten())):

                for i in range(4):
                    for j in range(4):
                        if (self.matrix[i][j] == 2 * current_state[i][j]):
                            temp += self.matrix[i][j]
                self.score = sum(np.array(self.matrix).flatten())
                return self.matrix, game_done, temp

            else:

                # print(0)
                return self.matrix, game_done, -100

        return self.matrix, game_done, self.score

    def generate_next(self):
        index = (self.gen(), self.gen())
        while self.matrix[index[0]][index[1]] != 0:
            index = (self.gen(), self.gen())
        self.matrix[index[0]][index[1]] = 2
Beispiel #15
0
class Gui(Frame):
    #==============================================================================
    #     Metodos Basicos
    #==============================================================================
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        # Atributos GUI
        self.parent = parent
        self.file_opt = self.flopt = {}
        w, h = self.parent.winfo_screenwidth(), self.parent.winfo_screenheight(
        )
        self.largura = w - 20
        self.altura = h - 20

        # Atributos funcionais
        self.img = None
        self.imgOld = None
        self.arqImg = StringVar()
        self.arqImg.set('')

        self.formatos = {}
        self.formatos['gif'] = 'GIF'
        self.formatos['jpg'] = 'JPEG'
        self.formatos['jpeg'] = 'JPEG'
        self.formatos['png'] = 'PNG'
        self.formatos['bmp'] = 'BMP'
        self.formatos['tif'] = 'TIFF'
        self.formatos['tiff'] = 'TIFF'
        self.formatos['ppm'] = 'PPM'
        self.formatos['pbm'] = 'PPM'
        self.formatos['pgm'] = 'PPM'

        self.tipos = [('Imagens', ('*.jpg', '*.png', '*.gif', '*.bmp', '*.ppm',
                                   '*.pgm', '*.pbm')), ('JPEG', '*.jpg'),
                      ('PNG', '*.png'), ('GIF', '*.gif'), ('BMP', '*.bmp'),
                      ('PPM', '*.ppm'), ('PGM', '*.pgm'), ('PBM', '*.pbm'),
                      ('Todos arquivos', '*')]

        # Cria/atualiza GUI
        self.createWidgets()
        self.update_idletasks()

#==============================================================================
#     Metodos relacionados ao comportamento da GUI
#==============================================================================

    def createWidgets(self):
        self.canvas = Canvas(self.parent, width=1366, height=768)
        self.scroll = Scrollbar(self.parent,
                                orient="vertical",
                                command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scroll.set)
        self.scroll.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)

        # Configura barra de menus
        self.menubar = Menu(self.parent)
        self.parent.config(menu=self.menubar)

        # Menu arquivo e suas opcoes
        self.menuArquivo = Menu(self.menubar)
        self.menuArquivo.add_command(label='Abrir',
                                     underline=0,
                                     command=self.abrir)
        self.menuArquivo.add_separator()
        self.menuArquivo.add_command(label='Salvar',
                                     underline=0,
                                     command=self.salvar)
        self.menuArquivo.add_command(label='Salvar Como...',
                                     underline=0,
                                     command=self.salvarComo)
        self.menuArquivo.add_separator()
        self.menuArquivo.add_command(label='Fechar imagem(ns)',
                                     underline=0,
                                     command=self.fecharArquivo)
        self.menuArquivo.add_command(label="Sair",
                                     underline=3,
                                     command=self.onExit)
        self.menubar.add_cascade(label="Arquivo",
                                 underline=0,
                                 menu=self.menuArquivo)

        # Menu editar e suas opcoes
        self.menuEditar = Menu(self.menubar)
        self.menuEditar.add_command(label='Desfazer',
                                    underline=0,
                                    command=self.desfazer)
        self.menubar.add_cascade(label="Editar",
                                 underline=0,
                                 menu=self.menuEditar)

        # Menu Imagem e suas opcoes
        self.menuImagem = Menu(self.menubar)

        self.submenuConverte = Menu(self.menuImagem)
        self.submenuConverte.add_command(label='Colorido RGB',
                                         underline=0,
                                         command=lambda: self.converte('RGB'))
        self.submenuConverte.add_command(label='Colorido RGBA',
                                         underline=0,
                                         command=lambda: self.converte('RGBA'))
        self.submenuConverte.add_command(label='Escala de cinza',
                                         underline=0,
                                         command=lambda: self.converte('L'))
        self.submenuConverte.add_command(label='Binario',
                                         underline=0,
                                         command=lambda: self.converte('1'))

        self.menuImagem.add_command(label='Informacoes gerais',
                                    underline=0,
                                    command=self.info)
        self.menuImagem.add_separator()
        self.menuImagem.add_cascade(label='Converter',
                                    underline=0,
                                    menu=self.submenuConverte)
        self.menubar.add_cascade(label="Imagem",
                                 underline=0,
                                 menu=self.menuImagem)

        # Menu de operacoes sobre cores e suas opcoes
        self.menuCores = Menu(self.menubar)

        self.submenuCinza = Menu(self.menuCores)
        self.submenuCinza.add_command(label='Decomposicao de Maximo',
                                      underline=18,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Decomposicao de Minimo',
                                      underline=18,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Average',
                                      underline=0,
                                      command=lambda: self.mudaCor('average'))
        self.submenuCinza.add_command(label='Lightness',
                                      underline=0,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Luminosity',
                                      underline=0,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Componente R',
                                      underline=11,
                                      command=lambda: self.mudaCor('r'))
        self.submenuCinza.add_command(label='Componente G',
                                      underline=11,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Componente B',
                                      underline=11,
                                      command=self.emConstrucao)
        self.submenuCinza.add_command(label='Quantidade arbitraria de tons',
                                      underline=0,
                                      command=self.emConstrucao)

        self.submenuHalftone = Menu(self.menuCores)
        self.submenuHalftone.add_command(
            label='Bayer 2x2',
            underline=6,
            command=lambda: self.halftoning('bayer2'))
        self.submenuHalftone.add_command(label='Bayer 5x5',
                                         underline=6,
                                         command=self.emConstrucao)
        self.submenuHalftone.add_command(label='Atkinson',
                                         underline=0,
                                         command=self.emConstrucao)
        self.submenuHalftone.add_command(label='Sierra Lite',
                                         underline=0,
                                         command=self.emConstrucao)
        self.submenuHalftone.add_command(label='Jarvis, Judice, and Ninke',
                                         underline=0,
                                         command=self.emConstrucao)
        self.submenuHalftone.add_command(
            label='Floyd-Steinberg',
            underline=0,
            command=lambda: self.halftoning('floyd'))

        self.menuCores.add_cascade(label='Tons de cinza',
                                   underline=0,
                                   menu=self.submenuCinza)
        self.menuCores.add_command(label='Inverter',
                                   underline=0,
                                   command=lambda: self.mudaCor('inv'))
        self.menuCores.add_command(label='Sepia',
                                   underline=0,
                                   command=self.emConstrucao)
        self.menuCores.add_separator()
        self.menuCores.add_command(label='Pseudo Binaria',
                                   underline=0,
                                   command=self.binaria)
        self.menuCores.add_cascade(label='Halftoning',
                                   underline=0,
                                   menu=self.submenuHalftone)
        self.menuCores.add_separator()
        self.menuCores.add_command(label='Cisalhamento de Cor',
                                   underline=0,
                                   command=self.emConstrucao)
        self.menuCores.add_command(label='Balanco de cores',
                                   underline=0,
                                   command=self.balancoCor)
        self.menuCores.add_command(label='Quantizacao de cores',
                                   underline=0,
                                   command=self.emConstrucao)
        self.menubar.add_cascade(label="Cores",
                                 underline=0,
                                 menu=self.menuCores)

        # Menu de operacoes topologicas e suas opcoes
        self.menuTopologia = Menu(self.menubar)
        self.menuTopologia.add_command(label='Rotular Componentes',
                                       underline=0,
                                       command=self.emConstrucao)
        self.menuTopologia.add_command(label='Transformada da Distancia',
                                       underline=0,
                                       command=self.emConstrucao)
        self.menuTopologia.add_command(label='Esqueletizacao',
                                       underline=0,
                                       command=self.emConstrucao)
        self.menubar.add_cascade(label="Topologia",
                                 underline=0,
                                 menu=self.menuTopologia)

        # Menu do trabalho e suas opcoes
        self.trabalho = Menu(self.menubar)
        self.trabalho.add_command(label='Tarefa 01',
                                  underline=20,
                                  command=self.abrir)

        # Grupo principal, onde serao atualizados os widgets
        self.grupoPrincipal = Frame(self.canvas,
                                    width=self.largura,
                                    height=self.altura,
                                    bd=1,
                                    padx=10,
                                    pady=10)
        self.grupoPrincipal.pack()
        #self.grupoPrincipal.grid_propagate(False) # Faz com que o Frame nao seja redimensionado com a mudanca dos widgets
        self.canvas.create_window((4, 20),
                                  window=self.grupoPrincipal,
                                  anchor="nw",
                                  tags="self.grupoPrincipal")
        self.grupoPrincipal.bind("<Configure>", self.OnFrameConfigure)

    def OnFrameConfigure(self, event):
        '''Reset the scroll region to encompass the inner frame'''
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

    def onExit(self):
        self.parent.destroy()

    def limpaTela(self):
        for widget in self.grupoPrincipal.winfo_children():
            widget.destroy()

    def emConstrucao(self):
        tkm.showinfo(title="Em construcao", message="Recurso em Construcao...")

    def load_file(self, titulo, varFile, tipos):
        if os.path.isfile(varFile.get()):
            path = os.path.dirname(varFile.get())
            self.flopt['initialdir'] = path
        else:
            self.flopt['initialdir'] = os.path.curdir
        self.flopt['filetypes'] = tipos
        arquivo = tkf.askopenfilename(title=titulo, **self.flopt)
        if arquivo:
            varFile.set(arquivo)

    def widgetFile(self, master, titulo, texto, varFile, tuplaFiletype):
        esteFrame = LabelFrame(master, text=titulo, padx=5, pady=5)

        j = 0
        varFile.set("Nenhum arquivo informado")
        labelRotulo = Label(esteFrame, text=texto)
        labelRotulo.grid(row=j, column=0, sticky=cte.E)

        botao = Button(
            esteFrame,
            text="Procurar",
            command=lambda: self.load_file(texto, varFile, tuplaFiletype),
            width=10)
        botao.grid(row=j, column=1, pady=5, sticky=cte.W)

        j += 1

        labelArq = Label(esteFrame, textvariable=varFile, bg='white')
        labelArq.grid(row=j, column=0, columnspan=2)

        return esteFrame

    def refreshImg(self):
        try:
            self.grupoPrincipal.photo = ImageTk.PhotoImage(self.img.img)
            if hasattr(self.grupoPrincipal, 'canvas'):
                self.grupoPrincipal.canvas.destroy()
            self.grupoPrincipal.canvas = Canvas(self.grupoPrincipal)
            self.grupoPrincipal.canvas.create_image(
                0, 0, image=self.grupoPrincipal.photo, anchor=cte.NW)
            self.grupoPrincipal.canvas.config(bg='white',
                                              width=self.img.altura,
                                              height=self.img.largura)
            #self.grupoPrincipal.canvas.place(x=self.parent.winfo_screenwidth()/2, y=self.parent.winfo_screenheight()/2, anchor=cte.CENTER)
            self.grupoPrincipal.canvas.place(x=0, y=0, anchor=cte.NW)
            self.grupoPrincipal.update_idletasks()
        except Exception as e:
            tkm.showerror('Erro', 'O seguinte erro ocorreu: %s' % str(e.args))

#==============================================================================
#   Metodos relacionados ao meno Arquivo
#==============================================================================

    def abrir(self):
        try:
            self.limpaTela()
            self.load_file('Arquivos de Imagem', self.arqImg, self.tipos)
            self.img = Imagem(self.arqImg.get())
            self.refreshImg()
        except Exception as e:
            tkm.showerror('Erro', 'O seguinte erro ocorreu: %s' % str(e.args))

    def saveFile(self):
        try:
            nome, extensao = os.path.splitext(self.arqImg.get())
            extensao = extensao.replace('.', '')
            self.img.salva(self.arqImg.get(), self.formatos[extensao.lower()])
            tkm.showinfo(
                'Sucesso', 'Arquivo %s salvo com sucesso' %
                os.path.basename(self.arqImg.get()))
        except Exception as e:
            tkm.showerror('Erro', 'O seguinte erro ocorreu: %s' % str(e.args))

    def salvar(self):
        if self.arqImg.get() == '':
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto para ser salvo')
        else:
            try:
                self.saveFile()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def salvarComo(self):
        if self.arqImg.get() == '':
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto para ser salvo')
        else:
            try:
                if os.path.isfile(self.arqImg.get()):
                    path = os.path.dirname(self.arqImg.get())
                    self.flopt['initialdir'] = path
                else:
                    self.flopt['initialdir'] = os.path.curdir
                self.flopt['filetypes'] = self.tipos
                nomeArq = tkf.asksaveasfilename(title='Salvar imagem como...',
                                                **self.flopt)
                if nomeArq:
                    self.arqImg.set(nomeArq)
                    self.saveFile()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def fecharArquivo(self):
        if not hasattr(
                self.grupoPrincipal,
                'canvas') or self.grupoPrincipal.canvas.find_all() == ():
            tkm.showwarning('Aviso', 'Nao ha imagens abertas')
        else:
            try:
                self.img = self.imgOld = None
                self.grupoPrincipal.canvas.delete('all')
                self.grupoPrincipal.update_idletasks()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

#==============================================================================
#  Metodos relacionados ao menu Editar
#==============================================================================

    def desfazer(self):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        elif self.imgOld is None:
            tkm.showwarning('Aviso', 'Impossivel Desfazer')
        else:
            try:
                temp = self.img
                self.img = self.imgOld
                self.imgOld = temp
                self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

#==============================================================================
#   Metodos relacionados ao menu Cores
#==============================================================================

    def mudaCor(self, metodo):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                self.imgOld = self.img
                self.img = cor.mudaCor(self.imgOld, metodo)
                self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def binaria(self):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                self.imgOld = self.img
                self.img = cor.binaria(self.imgOld)
                self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def getFatoresBalanco(self):
        self.fatores = [float(self.escalaFatorR.get())]
        self.fatores.append(float(self.escalaFatorG.get()))
        self.fatores.append(float(self.escalaFatorB.get()))

        self.w.destroy()

    def formBalanco(self):
        self.fator = None
        self.fatores = None

        self.w = Toplevel(self)
        self.w.wm_title("Informar os fatores de ajuste")

        self.w.geometry("+%d+%d" %
                        (self.winfo_rootx() + 50, self.winfo_rooty() + 50))
        self.w.focus_set()

        i = 0

        self.labelFatorR = Label(self.w, text='Ajuste em R', width=25)
        self.labelFatorR.grid(row=i, column=0)
        self.escalaFatorR = Scale(self.w,
                                  from_=0,
                                  to=2,
                                  resolution=0.05,
                                  length=350,
                                  orient=cte.HORIZONTAL)
        self.escalaFatorR.set(0.5)
        self.escalaFatorR.grid(row=i, column=1)
        i += 1

        self.labelFatorG = Label(self.w, text='Ajuste em G', width=25)
        self.labelFatorG.grid(row=i, column=0)
        self.escalaFatorG = Scale(self.w,
                                  from_=0,
                                  to=2,
                                  resolution=0.05,
                                  length=350,
                                  orient=cte.HORIZONTAL)
        self.escalaFatorG.set(0.5)
        self.escalaFatorG.grid(row=i, column=1)
        i += 1

        self.labelFatorB = Label(self.w, text='Ajuste em B', width=25)
        self.labelFatorB.grid(row=i, column=0)
        self.escalaFatorB = Scale(self.w,
                                  from_=0,
                                  to=2,
                                  resolution=0.05,
                                  length=350,
                                  orient=cte.HORIZONTAL)
        self.escalaFatorB.set(0.5)
        self.escalaFatorB.grid(row=i, column=1)
        i += 1

        self.botaoFator = Button(self.w,
                                 text='Ok',
                                 command=self.getFatoresBalanco,
                                 width=10)
        self.botaoFator.grid(row=i, column=0, columnspan=2)

        self.w.grid()

    def balancoCor(self):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                self.formBalanco()
                self.wait_window(self.w)
                if self.fatores is not None:
                    self.imgOld = self.img
                    self.img = cor.balanco(self.imgOld, self.fatores[0],
                                           self.fatores[1], self.fatores[2])
                    self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def halftoning(self, metodo='bayer2'):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                self.imgOld = self.img
                if metodo == 'bayer2':
                    self.img = cor.bayer(self.imgOld)
                elif metodo == 'floyd':
                    self.img = cor.floyd(self.imgOld)
                else:
                    raise Exception('Metodo de halftoning desconhecido')
                self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

#==============================================================================
#   Metodos relacionados ao menu Imagem
#==============================================================================

    def converte(self, modo='RGB'):
        if self.arqImg.get() == '' or self.img is None:
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                self.imgOld = self.img.copia()
                self.img.converte(modo)
                self.refreshImg()
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))

    def info(self):
        if self.arqImg.get() == '':
            tkm.showwarning('Aviso', 'Nao ha arquivo aberto')
        else:
            try:
                texto = 'Imagem %s, modo: %s (%d x %d pixels)' % (
                    self.img.img.format, self.img.img.mode,
                    self.img.img.size[0], self.img.img.size[1])
                tkm.showinfo('Aviso', texto)
            except Exception as e:
                tkm.showerror('Erro',
                              'O seguinte erro ocorreu: %s' % str(e.args))
class Game2048Env(gym.Env):
    metadata = {'render.modes': ['human', 'ansi']}

    def __init__(self):
        # Definitions for game. Board-matrix must be square.
        self.grid_cells = []
        self.user_ui = Frame()
        self.size = 4
        self.w = self.size
        self.h = self.size
        squares = self.size * self.size

        self.score = 0

        # Members for gym implementation:
        self.action_space = spaces.Discrete(4)
        # Suppose that the maximum tile is as if you have powers of 2 across the board-matrix.
        self.observation_space = spaces.Box(0,
                                            2**squares, (self.w * self.h, ),
                                            dtype=np.int)
        # Guess that the maximum reward is also 2**squares though you'll probably never get that.
        self.reward_range = (0., float(2**squares))

        # Initialise the random seed of the gym environment.
        self.seed()

        # Reset the board-matrix, ready for a new game.
        self.reset()

    def seed(self, seed=None):
        """Set the random seed for the gym environment."""
        self.np_random, seed = seeding.np_random(seed)
        return [seed]

    # Implementation of gym interface:
    def step(self, action):
        """Perform one step of the game. This involves moving and adding a new tile."""
        logging.debug("Action {}".format(action))
        score = 0
        done = None

        try:
            score = float(self.move(action))
            self.score += score
            assert score <= 2**(self.w * self.h)
            self.add_tile()
            done = self.isend()
            reward = float(score)
        except IllegalMove as e:
            logging.debug("Illegal move")
            done = False
            reward = 0.  # Illegal move non ha reward

        observation = self.Matrix

        info = {"max_tile": self.highest()}
        '''
        with open("mosseCSV.csv", "a") as f:
            savetxt(f, self.Matrix, delimiter=',')
        '''

        return observation, reward, done, info

    def reset(self):
        """Reset the game board-matrix and add 2 tiles."""
        self.Matrix = np.zeros((self.h, self.w), np.int)

        self.score = 0

        logging.debug("Adding tiles")
        self.add_tile()
        self.add_tile()

        # savetxt('mosseCSV.csv', self.Matrix, delimiter=',')

        # Iniziallizzazione dell'interfaccia grafica
        self.user_ui.master.title('2048 - MachineLearning Project')

        background = Frame(bg=c.BACKGROUND_COLOR_GAME,
                           width=c.SIZE,
                           height=c.SIZE)
        background.grid()

        for i in range(c.GRID_LEN):
            grid_row = []
            for j in range(c.GRID_LEN):
                cell = Frame(background,
                             bg=c.BACKGROUND_COLOR_CELL_EMPTY,
                             width=c.SIZE / c.GRID_LEN,
                             height=c.SIZE / c.GRID_LEN)
                cell.grid(row=i,
                          column=j,
                          padx=c.GRID_PADDING,
                          pady=c.GRID_PADDING)
                t = Label(master=cell,
                          text="",
                          bg=c.BACKGROUND_COLOR_CELL_EMPTY,
                          justify=CENTER,
                          font=c.FONT,
                          width=5,
                          height=2)
                t.grid()
                grid_row.append(t)
            self.grid_cells.append(grid_row)

        return self.Matrix

    def render(self, mode='human'):
        """ Visualizzazione grafica dell'environment. Può essere fatta anche in modo testuale """
        '''
        outfile = StringIO() if mode == 'ansi' else sys.stdout
        s = 'Score: {}\n'.format(self.score)
        s += 'Highest: {}\n'.format(self.highest())
        npa = np.array(self.Matrix)
        grid = npa.reshape((self.size, self.size))
        s += "{}\n".format(grid)
        outfile.write(s)
        return outfile
        '''

        for i in range(4):
            for j in range(4):
                o = self.get(i, j)
                # print(o) #Qua ci entra
                if o == 0:
                    self.grid_cells[i][j].configure(
                        text="", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
                else:
                    self.grid_cells[i][j].configure(
                        text=str(o),
                        bg=c.BACKGROUND_COLOR_DICT[o],
                        fg=c.CELL_COLOR_DICT[o])
        time.sleep(0.1)  # Rende visibili i cabiamenti all'occhio umano

        if self.isend():
            if self.highest() < 2048:
                self.grid_cells[1][1].configure(text="YOU", bg='#f54021')
                self.grid_cells[1][2].configure(text="LOSE", bg='#f54021')
            else:
                self.grid_cells[1][1].configure(text="YOU", bg='#00ff00')
                self.grid_cells[1][2].configure(text="WIN", bg='#00ff00')
            self.user_ui.update_idletasks()
            time.sleep(2)  # Rimane 2 secondi il messaggio di sconfitta

        self.user_ui.update_idletasks()  # Aggiorna l'interfaccia grafica

    def add_tile(self):
        """Add a tile with value 2 or 4 with different probabilities."""
        val = 0
        if self.np_random.random_sample() > 0.8:
            val = 4
        else:
            val = 2
        empties = self.empties()
        assert empties
        empty_idx = self.np_random.choice(len(empties))
        empty = empties[empty_idx]
        logging.debug("Adding %s at %s", val, (empty[0], empty[1]))
        self.set(empty[0], empty[1], val)

    def get(self, x, y):
        """Get the value of one square."""
        return self.Matrix[x, y]

    def set(self, x, y, val):
        """Set the value of one square."""
        self.Matrix[x, y] = val

    def empties(self):
        """Return a list of tuples of the location of empty squares."""
        empties = list()
        for y in range(self.h):
            for x in range(self.w):
                if self.get(x, y) == 0:
                    empties.append((x, y))
        return empties

    def highest(self):
        """Report the highest tile on the board-matrix."""
        highest = 0
        for y in range(self.h):
            for x in range(self.w):
                highest = max(highest, self.get(x, y))
        return highest

    def move(self, direction, trial=False):
        """Perform one move of the game. Shift things to one side then,
        combine. directions 0, 1, 2, 3 are up, right, down, left.
        Returns the score that [would have] got."""

        if not trial:
            if direction == 0:
                logging.debug("Up")
            elif direction == 1:
                logging.debug("Right")
            elif direction == 2:
                logging.debug("Down")
            elif direction == 3:
                logging.debug("Left")

        changed = False
        move_score = 0
        dir_div_two = int(direction / 2)
        dir_mod_two = int(direction % 2)
        shift_direction = dir_mod_two ^ dir_div_two  # 0 for towards up left, 1 for towards bottom right

        # Construct a range for extracting row/column into a list
        rx = list(range(self.w))
        ry = list(range(self.h))

        if dir_mod_two == 0:
            # Up or down, split into columns
            for y in range(self.h):
                old = [self.get(x, y) for x in rx]
                (new, ms) = self.shift(old, shift_direction)
                move_score += ms
                if old != new:
                    changed = True
                    if not trial:
                        for x in rx:
                            self.set(x, y, new[x])
        else:
            # Left or right, split into rows
            for x in range(self.w):
                old = [self.get(x, y) for y in ry]
                (new, ms) = self.shift(old, shift_direction)
                move_score += ms
                if old != new:
                    changed = True
                    if not trial:
                        for y in ry:
                            self.set(x, y, new[y])
        if not changed:
            raise IllegalMove

        return move_score

    def combine(self, shifted_row):
        """Combine same tiles when moving to one side. This function always
           shifts towards the left. Also count the score of combined tiles."""
        move_score = 0
        combined_row = [0] * self.size
        skip = False
        output_index = 0
        for p in pairwise(shifted_row):
            if skip:
                skip = False
                continue
            combined_row[output_index] = p[0]
            if p[0] == p[1]:
                combined_row[output_index] += p[1]
                move_score += p[0] + p[1]
                # Skip the next thing in the list.
                skip = True
            output_index += 1
        if shifted_row and not skip:
            combined_row[output_index] = shifted_row[-1]

        return combined_row, move_score

    def shift(self, row, direction):
        """Shift one row left (direction == 0) or right (direction == 1), combining if required."""
        length = len(row)
        assert length == self.size
        assert direction == 0 or direction == 1

        # Shift all non-zero digits up
        shifted_row = [i for i in row if i != 0]

        # Reverse list to handle shifting to the right
        if direction:
            shifted_row.reverse()

        (combined_row, move_score) = self.combine(shifted_row)

        # Reverse list to handle shifting to the right
        if direction:
            combined_row.reverse()

        assert len(combined_row) == self.size
        return combined_row, move_score

    def isend(self):
        """Check if the game is ended. Game ends if there is a 2048 tile or
        there are no legal moves. If there are empty spaces then there must
        be legal moves."""

        if self.highest() == 2048:
            return True

        for direction in range(4):
            try:
                self.move(direction, trial=True)
                # Not the end if we can do any move
                return False
            except IllegalMove:
                pass
        return True

    def get_board(self):
        """Get the whole board-matrix, useful for testing."""
        return self.Matrix

    def set_board(self, new_board):
        """Set the whole board-matrix, useful for testing."""
        self.Matrix = new_board
Beispiel #17
0
class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

        self.base_image_paths = []
        self.base_images = []
        self.base_img_canvas = []
        self.base_voltages = []
        self.base_idx = 0

        self.mole_image_paths = []
        self.mole_images = []
        self.mole_img_canvas = []
        self.mole_voltages = []
        self.mole_idx = 0

    def create_widgets(self):
        pane = PanedWindow(self.master, orient='vertical')
        pane.pack(expand=True, fill=tk.BOTH, side='left')

        self.frame = Frame(pane, bd=2, relief='ridge')
        pane.add(self.frame)

        # Main frame
        Label(self.frame, text='Theoritical d of Base:').grid(row=0,
                                                              column=0,
                                                              padx=10,
                                                              pady=10)
        self.theoretical_d = Entry(self.frame, width=15)
        self.theoretical_d.grid(column=1, row=0)
        Label(self.frame, text='Å').grid(row=0, column=2)

        # Images of Base frame
        self.fm_base = Frame(pane, bd=2, relief='ridge', pady=20)
        pane.add(self.fm_base)
        Label(self.fm_base, text='○ Images of Base').grid(row=0, column=0)
        Label(self.fm_base, text='Images').grid(row=1, column=0, pady=100)
        Label(self.fm_base, text='Base Voltage[V]').grid(row=2,
                                                         column=0,
                                                         pady=20)

        self.fm_base_canvas = Canvas(self.fm_base,
                                     width=1000,
                                     highlightthickness=0)
        self.fm_base_canvas.grid(row=1,
                                 column=1,
                                 rowspan=2,
                                 sticky='news',
                                 padx=35)

        self.fm_base_bar = Scrollbar(self.fm_base,
                                     orient='horizontal',
                                     command=self.fm_base_canvas.xview)
        self.fm_base_bar.grid(row=3, column=1, sticky='ew', padx=35)
        self.fm_base_canvas.config(xscrollcommand=self.fm_base_bar.set)

        self.fm_base_canvas_frame = Frame(self.fm_base_canvas)
        self.fm_base_canvas.create_window((0, 20),
                                          window=self.fm_base_canvas_frame,
                                          anchor='nw')

        self.fm_base_btn = ttk.Button(self.fm_base, text='select images')
        self.fm_base_btn.config(command=lambda: self.select_file(isBase=True))
        self.fm_base_btn.grid(row=0, column=1, sticky='w', padx=30)

        # Images of Molecules frame
        self.fm_mole = Frame(pane, bd=2, relief='ridge', pady=20)
        pane.add(self.fm_mole)
        Label(self.fm_mole, text='○ Images of Molecules').grid(row=0, column=0)
        Label(self.fm_mole, text='Images').grid(row=1, column=0, pady=100)
        Label(self.fm_mole, text='Base Voltage[V]').grid(row=2,
                                                         column=0,
                                                         pady=20)

        self.fm_mole_canvas = Canvas(self.fm_mole,
                                     width=1000,
                                     highlightthickness=0)
        self.fm_mole_canvas.grid(row=1, column=1, rowspan=2, sticky='news')

        self.fm_mole_bar = Scrollbar(self.fm_mole,
                                     orient='horizontal',
                                     command=self.fm_mole_canvas.xview)
        self.fm_mole_bar.grid(row=3, column=1, sticky='ew')
        self.fm_mole_canvas.config(xscrollcommand=self.fm_mole_bar.set)

        self.fm_mole_canvas_frame = Frame(self.fm_mole_canvas)
        self.fm_mole_canvas.create_window((0, 20),
                                          window=self.fm_mole_canvas_frame,
                                          anchor='nw')

        self.fm_mole_btn = ttk.Button(self.fm_mole, text='select images')
        self.fm_mole_btn.config(command=lambda: self.select_file(isBase=False))
        self.fm_mole_btn.grid(row=0, column=1, sticky='w', padx=30)

        # Run blob detection
        self.fm_run = Frame(pane, bd=2, relief='ridge', pady=10)
        pane.add(self.fm_run)
        ttk.Button(self.fm_run, text='RUN', command=self.run).pack()

    def run(self):
        theoretical_d = float(self.theoretical_d.get().replace('\x10', ''))
        base_voltages = [
            float(base_voltage.get().replace('\x10', ''))
            for base_voltage in self.base_voltages
        ]
        mole_voltages = [
            float(mole_voltage.get().replace('\x10', ''))
            for mole_voltage in self.mole_voltages
        ]

        r = detector.detect_base_blob(theoretical_d, self.base_image_paths,
                                      base_voltages)
        detector.detect_mole_blob(r, self.mole_image_paths, mole_voltages)

    def select_file(self, isBase):
        # initialdir = os.path.abspath(os.path.dirname("__file__"))
        initialdir = os.path.abspath(os.path.dirname('../data/'))
        files = filedialog.askopenfilenames(initialdir=initialdir)

        if isBase:
            for idx, filename in enumerate(files):
                i = self.base_idx
                self.base_img_canvas.append(Canvas(self.fm_base_canvas_frame))
                self.base_voltages.append(Entry(self.fm_base_canvas_frame))

                self.base_image_paths.append(filename)
                self.base_images.append(self.read_image(filename))
                self.base_img_canvas[i].create_image(
                    self.base_images[i]['width'] / 2,
                    self.base_images[i]['height'] / 2,
                    image=self.base_images[i]['img'])
                self.base_img_canvas[i].grid(row=0, column=self.base_idx)
                self.base_voltages[i].grid(row=1,
                                           column=self.base_idx,
                                           pady=(20, 0))
                self.base_idx += 1

            self.fm_base_canvas_frame.update_idletasks()
            self.fm_base_canvas.config(
                scrollregion=self.fm_base_canvas.bbox('all'))
        else:
            for idx, filename in enumerate(files):
                i = self.mole_idx
                self.mole_img_canvas.append(Canvas(self.fm_mole_canvas_frame))
                self.mole_voltages.append(Entry(self.fm_mole_canvas_frame))

                self.mole_image_paths.append(filename)
                self.mole_images.append(self.read_image(filename))
                self.mole_img_canvas[i].create_image(
                    self.mole_images[i]['width'] / 2,
                    self.mole_images[i]['height'] / 2,
                    image=self.mole_images[i]['img'])
                self.mole_img_canvas[i].grid(row=0, column=self.mole_idx)
                self.mole_voltages[i].grid(row=1,
                                           column=self.mole_idx,
                                           pady=(20, 0))
                self.mole_idx += 1

            self.fm_mole_canvas_frame.update_idletasks()
            self.fm_mole_canvas.config(
                scrollregion=self.fm_mole_canvas.bbox('all'))

    def read_image(self, path):
        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        height = int(img.shape[0] / 5)
        width = int(img.shape[1] / 5)
        img = cv2.resize(img, (width, height))
        img = Image.fromarray(img)
        img = ImageTk.PhotoImage(img)

        return {'img': img, 'height': height, 'width': width}