예제 #1
0
def askForAnswer(title: str,
                 message: str,
                 root: tk.Tk = None,
                 topFrame: tk.Frame = None,
                 destroy=True):
    """cancel: 是否取消了回答"""
    def delete(save=True):
        """
        save: 是否返回输入
        """
        root.protocol('WM_DELETE_WINDOW', lambda *a, r=root: r.destroy())
        if not save:
            s.set('')
            cancel[0] = True
        if destroy:
            root.destroy()
        alive[0] = False

    alive = [True]
    cancel = [False]
    if not root:
        root = tk.Tk()
    if not topFrame:
        topFrame = tk.Frame(root)
        topFrame.pack()
    root.title(title)
    root.protocol('WM_DELETE_WINDOW', lambda *a: delete(False))
    s = tk.StringVar()

    tk.Label(topFrame, text=message).pack(expand=True)

    frame = tk.Frame(topFrame)
    frame.pack(expand=True, fill=tk.X)

    tk.Entry(frame, textvariable=s, width=60).pack(side=tk.LEFT,
                                                   expand=True,
                                                   fill=tk.X)
    tk.Button(frame, text='确认', command=delete).pack(side=tk.LEFT,
                                                     expand=True,
                                                     fill=tk.X)

    while alive[0]:
        try:
            root.update()
        except tk.TclError:
            break
    topFrame.forget()
    return s.get(), cancel[0]
예제 #2
0
class Main:
    def __init__(self):
        self.root = Tk()
        self.root.geometry('700x600')
        self.root.title('GESTON DE STOCK')

        self.frame_produit = None
        self.frame_categorie = None

        self.menu = Menu(self.root)
        self.root['menu'] = self.menu

        self.menu.add_command(label='Categorie', command=self.show_categorie)
        self.menu.add_command(label='Produit', command=self.show_produit)
        Message(self.root,
                text='Application de gestion de stock').grid(row=0,
                                                             column=0,
                                                             columnspan=4)
        self.root.mainloop()

    def show_categorie(self):
        if self.frame_categorie is None:
            self.frame_categorie = Frame(self.root)
            self.frame_categorie.grid(row=0, column=0)  #afficher les categorie
            if self.frame_produit is not None:
                self.frame_produit.grid_forget(
                )  # retirer la page des produits
            self.frame_produit = None
            CategorieView(self.frame_categorie)

    def show_produit(self):
        if self.frame_produit is None:
            self.frame_produit = Frame(self.root)
            self.frame_produit.grid(row=0, column=0)
            if self.frame_categorie is not None:
                self.frame_categorie.forget()
            self.frame_categorie = None
            ProduitView(self.frame_produit)
예제 #3
0
class login:
    """ classe de base de login-box utile pour une entrée de nouvel utilisateur

options standards:
-title:le titre de la boite de dialogue(texte)
-mask:le caractère qui sera présenté pour cacher les lettre du mot de passe

methodes /fonctions:
-show: affiche la boite de login et retourne les infos entrées par l'utilisateur
"""
    def __init__(self, title="Log in Box", mask="&"):
        """Constructor of login Box\nargs:title,selected"""
        from tkinter import Tk, Frame, Label, Entry, Button, BooleanVar, Checkbutton
        self.__Entry__ = Entry
        self.__usr__, self.__pwrd__ = None, None
        self.__mask__ = mask
        self.__root__ = Tk()
        self.__frm__ = Frame(self.__root__)
        self.__frm__.pack(side="top")
        self.__frm2__ = Frame(self.__root__)
        self.__frm2__.pack()
        self.__root__.title(title)
        self.__root__.resizable(False, False)
        self.__lbl_usr__ = Label(self.__frm__,
                                 text="User name : ",
                                 bd=4,
                                 relief="groove",
                                 width=13)
        self.__lbl_usr__.grid(row=1, column=1)
        self.__lbl_pwrd__ = Label(self.__frm__,
                                  text="Password : "******"groove",
                                  width=13)
        self.__lbl_pwrd__.grid(row=2, column=1)
        self.__lbl_pwrd2__ = Label(self.__frm2__,
                                   text="Password again: ",
                                   bd=4,
                                   relief="groove",
                                   width=13)
        self.__lbl_pwrd2__.grid(row=1, column=1)
        self.__txt_usr__ = Entry(self.__frm__, width=15)
        self.__txt_usr__.grid(row=1, column=2)
        self.__txt_pwrd__ = Entry(self.__frm__, width=15, show=self.__mask__)
        self.__txt_pwrd__.grid(row=2, column=2)
        self.__txt_pwrd2__ = Entry(self.__frm2__, width=15, show=self.__mask__)
        self.__txt_pwrd2__.grid(row=1, column=2)
        self.__frm___ok_cancel = Frame(self.__root__, width=76)
        self.__frm___ok_cancel.pack(side="bottom")
        self.__btn_ok__ = Button(self.__frm___ok_cancel,
                                 text="Ok",
                                 width=6,
                                 command=self.__func_ok__)
        self.__btn_ok__.pack(side="left", padx=5)
        self.__var_check__ = BooleanVar(self.__root__, True)
        self.__check__ = Checkbutton(self.__frm___ok_cancel,
                                     text="Hide code",
                                     variable=self.__var_check__,
                                     command=self.__Check__)
        self.__check__.pack(side="left", padx=2)
        self.__btn_cancel__ = Button(self.__frm___ok_cancel,
                                     text="Cancel",
                                     width=6,
                                     command=self.__cancel__)
        self.__btn_cancel__.pack(side="right", padx=5)
        self.__root__.bind("<Escape>", self.__cancel__)
        self.__txt_usr__.bind("<Return>", self.__func_ok__)
        self.__txt_pwrd__.bind("<Return>", self.__func_ok__)
        self.__txt_pwrd2__.bind("<Return>", self.__func_ok__)
        self.__btn_ok__.bind("<Return>", self.__func_ok__)
        self.__txt_usr__.focus()

    def __Check__(self, event=None):
        """Check if checkbutton's value is true or false to show or hide the password
and hide or show the password entry"""
        lst = "", "&"
        self.__txt_pwrd__.configure(show=lst[self.__var_check__.get()])
        if self.__var_check__.get() == 0:
            self.__frm2__.forget()
            self.__txt_pwrd__.focus()
            self.__txt_pwrd2__.destroy()
        else:
            self.__txt_pwrd2__ = self.__Entry__(self.__frm2__,
                                                width=15,
                                                show=self.__mask__)
            self.__txt_pwrd2__.grid(row=1, column=2)
            self.__txt_pwrd2__.focus()
            self.__txt_pwrd2__.bind("<Return>", self.__func_ok__)
            self.__frm2__.pack()
        self.__root__.update()

    def show(self):
        """show the login box and wait for the user's codes which would be return"""
        self.__root__.mainloop()
        return self.__usr__, self.__pwrd__

    def __cancel__(self, event=None):
        """Escape from the login-box"""
        self.__root__.destroy()

    def __error__(self, arg):
        """signal an error to the user"""
        from winsound import MessageBeep as snd
        snd(23)
        arg.configure(bg="red")
        arg.after(200, lambda col="SystemWindow": arg.configure(bg=col))
        arg.focus()
        pass

    def __func_ok__(self, event=None):
        """Central function which defines what to do"""
        from winsound import MessageBeep as snd
        self.__usr__, self.__pwrd__ = self.__txt_usr__.get(
        ), self.__txt_pwrd__.get()
        pwrd2 = None
        try:
            pwrd2 = self.__txt_pwrd2__.get()
            self.__frm2__.info()
            show = True
        except:
            show = False
        if self.__usr__ == "":
            self.__error__(self.__txt_usr__)
        elif self.__pwrd__ == "":
            self.__error__(self.__txt_pwrd__)
        elif pwrd2 == "" and show == True:
            self.__error__(self.__txt_pwrd2__)
            pass
        elif pwrd2 != self.__pwrd__ and show == True:
            self.__txt_pwrd2__.destroy()
            self.__txt_pwrd2__ = self.__Entry__(self.__frm2__,
                                                width=15,
                                                show=self.__mask__)
            self.__txt_pwrd2__.grid(row=1, column=2)
            self.__txt_pwrd2__.focus()
            self.__txt_pwrd2__.bind("<Return>", self.__func_ok__)
            self.__txt_pwrd2__.after(750, self.__txt_pwrd2__.focus)
            popup(
                self.__root__,
                message="The 2 passwords are not\nthe sames please try again!")
        else:
            snd(75)
            self.__root__.destroy()

    def __reset__(self):
        """clear the user-name and the password"""
        try:
            self.__txt_usr__.destroy()
            self.__txt_pwrd__.destroy()
        except:
            pass
        try:
            self.__txt_usr__ = self.__Entry__(self.__frm__, width=15)
            self.__txt_usr__.grid(row=1, column=2)
            self.__txt_usr__.focus()
            self.__txt_pwrd__ = self.__Entry__(self.__frm__,
                                               width=15,
                                               show=self.__mask__)
            self.__txt_pwrd__.grid(row=2, column=2)
            self.__txt_usr__.bind("<Return>", self.__func_ok__)
            self.__txt_pwrd__.bind("<Return>", self.__func_ok__)
            self.__txt_usr__.focus()
        except:
            pass
        try:
            self.__root__.update()
        except:
            pass
예제 #4
0
class ContentInput(Frame):
    def __init__(self, master, question_number, load_data=None):
        super().__init__(master, bg=StyledTkinter.get_medium_color())

        self.part_of_answer = IntVar(value=1)
        self.display_open = False
        self.question_number = question_number

        self.header = Frame(self, bg=StyledTkinter.get_medium_color())
        self.toggle_text = StringVar(value="+")
        self.toggle_display = StyledTkinter.get_dark_button(
            self.header,
            textvariable=self.toggle_text,
            command=self.toggle_input_display,
            width=2)
        self.head_text_container = Frame(
            self.header,
            bg=StyledTkinter.get_medium_color(),
            highlightcolor=StyledTkinter.get_dark_color(),
            highlightthickness=1,
            highlightbackground=StyledTkinter.get_dark_color())
        self.header_title = Label(self.head_text_container,
                                  bg=StyledTkinter.get_medium_color(),
                                  text="Question " + str(question_number + 1))
        self.header_is_in_solution_indicator = Label(
            self.head_text_container,
            text="In Solution",
            bg=StyledTkinter.get_medium_color())

        self.question_frame = Frame(self, bg=StyledTkinter.get_medium_color())
        self.question_title_row = Frame(self.question_frame,
                                        bg=StyledTkinter.get_medium_color())
        self.question_in_solution = Checkbutton(
            self.question_title_row,
            text='Use in solution',
            variable=self.part_of_answer,
            bg=StyledTkinter.get_medium_color(),
            command=self.update_is_in_solution_indicator)
        self.question_label = Label(self.question_title_row,
                                    bg=StyledTkinter.get_medium_color(),
                                    text="Question")
        self.question = RichTextInput(self.question_frame)

        self.answer_tabs = TabContainer(self)

        answer_frame = self.answer_tabs.create_empty_tab("Answer")
        self.answer = RichTextInput(answer_frame)

        self.fillers = []
        for i in range(3):
            answer_frame = self.answer_tabs.create_empty_tab("Filler " +
                                                             str(i + 1))
            self.fillers.append(RichTextInput(answer_frame))

        self.load(load_data)

    def update_is_in_solution_indicator(self):
        if self.part_of_answer.get():
            self.header_is_in_solution_indicator.config(text="In Solution")
        else:
            self.header_is_in_solution_indicator.config(text="")

    def display(self):
        super().pack(expand=True, fill=X)

        self.header.pack(expand=True, fill=X, pady=(5, 5))
        self.toggle_display.pack(side=LEFT)
        self.head_text_container.pack(side=LEFT, expand=True, fill=BOTH)
        self.header_title.pack(side=LEFT, padx=(0, 5), expand=True, fill=X)
        self.header_is_in_solution_indicator.pack(side=LEFT,
                                                  padx=(0, 5),
                                                  expand=True,
                                                  fill=X)

        self.question_title_row.pack(expand=True, fill=X)
        self.question_label.pack(side=LEFT, padx=(0, 5), pady=(0, 5))
        self.question_in_solution.pack(side=LEFT, padx=(0, 5), pady=(0, 5))
        self.question.display(expand=True, fill=X)

        self.answer.display(expand=True, fill=X)
        for filler in self.fillers:
            filler.display(expand=True, fill=X)

    def fill_with_test_data(self, index):
        ContentInput.update_input(self.question.input,
                                  "Question" + str(index + 1))
        ContentInput.update_input(self.answer.input, "Answer" + str(index + 1))

        for filler in self.fillers:
            filler_index = self.fillers.index(filler)
            ContentInput.update_input(
                filler.input,
                "Q" + str(index + 1) + " Filler" + str(filler_index + 1))

    @staticmethod
    def update_input(input_to_update, text):
        curr_text = input_to_update.get("1.0", END)

        if curr_text.strip() == "":
            input_to_update.insert(INSERT, text)

    def toggle_input_display(self):
        if self.display_open:
            self.close_input_display()
        elif not self.display_open:
            self.open_input_display()

    def open_input_display(self):
        self.question_frame.pack(side=LEFT, expand=True, fill=X, padx=(0, 4))
        self.answer_tabs.display(side=LEFT, expand=True, fill=X)

        self.toggle_text.set("-")
        self.display_open = True

        PyBus.Instance().post(CloseOtherInputs(self.question_number))

    def close_input_display(self):
        self.question_frame.forget()
        self.answer_tabs.forget()
        self.toggle_text.set("+")
        self.display_open = False

    def load(self, load_data):
        if load_data is not None:
            self.part_of_answer.set(load_data['part_of_answer'])
            self.question.load_content(load_data['question'])
            self.answer.load_content(load_data['answer'])

            for filler in load_data['fillers']:
                index = load_data['fillers'].index(filler)
                self.fillers[index].load_content(filler)

    def is_filled(self):
        answer_content = self.answer.get_content()
        if not answer_content["text"] and not answer_content["placed_images"]:
            return False

        question_content = self.question.get_content()
        if not question_content["text"] and not question_content[
                "placed_images"]:
            return False

        for filler in self.fillers:
            filler_content = filler.get_content()

            if not filler_content["text"] and not filler_content[
                    "placed_images"]:
                return False

        return True

    def get_as_dict(self):
        return {
            'part_of_answer': self.part_of_answer.get(),
            'question': self.question.get_content(),
            'answer': self.answer.get_content(),
            'fillers': [x.get_content() for x in self.fillers]
        }
예제 #5
0
class InitScreen:
    def __init__(self, master):
        self.funcs = {}
        self.master = master
        self.controller = InitScreenController(master)
        self.master.title('parent')
        self.master.geometry('640x480+200+150')

        self.set_param_init()

        self.frame.pack()

        self.master.mainloop()

    def set_param_init(self):
        self.frame = Frame(width=400, height=300, bd=2)
        self.frame.grid_bbox(2, 4 + default_fields_count)

        self._buttons_init()

        self.entrys = {}
        _vcmd = self.frame.register(self._validate)

        count = 0

        for block_name, block in default_params.items():
            Label(self.frame,
                  text=_convert(block_name),
                  background="#999",
                  justify=LEFT).grid(
                    row=count,
                    column=1
            )
            count += 1

            for name, _default in block.items():
                default, func = _default

                Label(self.frame,
                      text=_convert(name),
                      justify=LEFT).grid(
                        row=count,
                        column=1
                )
                # self.entrys[_convert(name)] = ""
                sv = StringVar(
                        value=default_params[block_name][name][0])
                e = Entry(self.frame)

                self.entrys[name] = sv
                self.funcs[e] = func

                e.config(validate='key',
                         vcmd=(_vcmd, "%P", "%W"),
                         textvariable=sv)
                e.grid(row=count,
                       column=2)

                count += 1

        Label(self.frame,
              text="Количество существ:",
              justify=LEFT).grid(
                row=count,
                column=1
        )

        self.creature_count = \
            Label(self.frame,
                  text='0',
                  justify=LEFT)
        self.creature_count.grid(
                row=count,
                column=2
        )

    def _buttons_init(self):
        self.load_button = Button(self.frame,
                                  text='Загрузить',
                                  command=self.load_button_press)
        self.load_button.grid(row=4 + default_fields_count,
                              column=1)

        self.start_button = Button(self.frame,
                                   text='Старт',
                                   command=self.start_button_press)
        self.start_button.grid(row=4 + default_fields_count,
                               column=2)

        self.master.protocol('WM_DELETE_WINDOW',
                             self.exit)

    def _validate(self, P, W):
        e = self.frame.nametowidget(W)
        func = self.funcs[e]

        try:
            func(P)
        except ValueError:
            return False
        else:
            return True

    def _collect_params(self):
        params = deepcopy(default_params)
        for block in params.values():
            for key in block:
                func = block[key][1]
                block[key] = func(self.entrys[key].get())

        return params

    def start_button_press(self):
        params = self._collect_params()

        if self.controller.model:
            self.game_screen = GameScreen(self.master, params, model=self.controller.model)
        else:
            self.game_screen = GameScreen(self.master, params)

        self.frame.forget()

    def load_button_press(self):

        self.controller.load_button_press()

        model = self.controller.model
        self.creature_count.config(text=str(len(model.creatures)))

        for block in model.params.values():
            for k, v in block.items():
                if k == "in_layers":
                    v = ", ".join([str(x) for x in v])
                self.entrys[k].set(v)

    def exit(self):
        exit()
예제 #6
0
class YEPT_window():

    def __init__(self):
        self.root = Tk()
        self.root.resizable(width = False, height = True)
        self._add_icon()
        self.layout()
    
    def layout(self):
        self._layout_main()
        self._layout_blast()
        canvas = Canvas(self.total, width = 14, height = 150)
        canvas.create_line(10, 0, 10, 150, fill = "#D8D8D8", width = 2)
        canvas.pack(after = self.blast, side = LEFT)
        self._layout_primerDesign()
        self.b2 = Button(self.frmbt, 
                         text = 'Get Checking Primers', 
                         font = ("Arial", 12))
        self.b2.bind("<Button-1>", self.openCheckPrimerWindow)
        self._layout_bottom()

    def _add_icon(self):
        self.root.iconbitmap(_iconPath)
    
    def _layout_main(self):
        self.root.title("YEPT - SLST,ShanghaiTech")
        # Up center banner
        l = Label(self.root, 
                  text="Welcome to YEPT!", 
                  font = ("Arial", 13), 
                  width = 15, height = 2)
        l.pack()

        # Main frame
        self.total = Frame(self.root)
        self.total.pack(fill = X)

    def _layout_blast(self):
        # Frame at the left side
        self.blast = Frame(self.total)
        self.blast.pack(pady = 5, padx = 8, side = LEFT)
        
        self.btf = Frame(self.blast)
        self.btf.pack(pady=5,fill=X)
        
        btitle = Label(self.btf, 
                       text = 'BLAST to get AccessionID', 
                       font = ("Arial", 10), width = 19)
        btitle.pack(side = RIGHT)
        
        self.lblast = Label(self.btf, 
                            text = "(Don't like it? Do it yourself.)", 
                            font = ("Arial", 9), fg = 'blue', width = 22)
        self.lblast.bind('<Enter>', self._blast_showlink)
        self.lblast.bind('<Leave>', self._blast_notshowlink)
        self.lblast.bind('<Button-1>', self._blast_gotoBLAST)
        self.lblast.pack(side = RIGHT, padx = 5)

        self._layout_blast_line1()
        self._layout_blast_line2()

        self.tb = Text(self.blast, width = 65, height = 6)
        self.tb.pack(pady = 5, side = RIGHT)

    def _layout_blast_line1(self):
        # BLAST species selection
        b_species = Frame(self.blast)
        b_species.pack(pady = 5, fill = X)
        
        bspl = Label(b_species, 
                     text = "Target pecies:", 
                     font = ("Arial", 10), width = 10)
        self.bsp_var = StringVar()
        self.bsp_var.set(5)
        bIssj = Radiobutton(b_species, 
                            text = "S. japonicus", 
                            variable = self.bsp_var, value = "J")
        bIssj.bind("<Button-1>", self._focusB)
        bIssc = Radiobutton(b_species, 
                            text = "S. cryophilus", 
                            variable = self.bsp_var, value = "C")
        bIssc.bind("<Button-1>", self._focusB)
        bIsso = Radiobutton(b_species, 
                            text = "S. octosporus", 
                            variable = self.bsp_var, value = "O")
        bIsso.bind("<Button-1>", self._focusB)
        bIsso.pack(side = RIGHT)
        bIssc.pack(side = RIGHT)
        bIssj.pack(side = RIGHT)
        bspl.pack(side = RIGHT)
    
    def _layout_blast_line2(self):
        # Gene name entry line
        sp_name = Frame(self.blast)
        sp_name.pack(pady = 5, fill = X)
        
        sp_name_l = Label(sp_name, 
                          text = 'Gene in S. pombe:', 
                          font = ("Arial", 10), width = 13)
        sp_name_l.pack(side = RIGHT)        
        self.sp_name_e = Entry(sp_name, width = 6)
        self.sp_name_e.bind("<Button-1>", self._focusB)
        self.sp_name_e.bind("<Return>", self._BLAST)
        self.sp_name_e.bind("<Key>", self._forgetb2)
        self.sp_name_e.pack(side = RIGHT, padx = 5, before = sp_name_l)

        cov_l = Label(sp_name, 
                      text = 'Cov cutoff:', font = ("Arial", 10), width = 7)
        cov_l.pack(side = RIGHT, before = self.sp_name_e)
        self.cov_cutoff = Entry(sp_name, width = 4)
        self.cov_cutoff.insert(END, '0.15')
        self.cov_cutoff.bind("<Button-1>", self._focusB)
        self.cov_cutoff.bind("<Return>", self._BLAST)
        self.cov_cutoff.bind("<Key>", self._forgetb2)
        self.cov_cutoff.pack(side = RIGHT, padx = 5, before = cov_l)

        ev_l = Label(sp_name, 
                     text = 'evalue cutoff:', font = ("Arial", 10), width = 10)
        ev_l.pack(side = RIGHT, before = self.cov_cutoff)
        self.ev_cutoff = Entry(sp_name, width = 3)
        self.ev_cutoff.insert(END, '1')
        self.ev_cutoff.bind("<Button-1>", self._focusB)
        self.ev_cutoff.bind("<Return>", self._BLAST)
        self.ev_cutoff.bind("<Key>", self._forgetb2) 
        self.ev_cutoff.pack(side = RIGHT, padx = 5, before = ev_l)
        
        self.button_blast = Button(sp_name, text = 'BLAST', 
                                   font = ("Arial", 9))
        self.button_blast.bind('<Button-1>', self._BLAST)
        self.button_blast.bind('<Return>', self._BLAST)
        self.button_blast.pack(side = RIGHT, before = self.ev_cutoff)

    def _blast_showlink(self, event):
        self.lblast.config(bg = "#D8D8D8")
    
    def _blast_notshowlink(self, event):
        self.lblast.forget()
        self.lblast = Label(self.btf, 
                            text = "(Don't like it? Do it yourself.)", 
                            font = ("Arial", 9), fg = 'blue', width = 22)
        self.lblast.bind('<Enter>', self._blast_showlink)
        self.lblast.bind('<Leave>', self._blast_notshowlink)
        self.lblast.bind('<Button-1>', self._blast_gotoBLAST)
        self.lblast.pack(side=RIGHT,padx=5)
    
    def _blast_gotoBLAST(self, event):
        BLASTn_url = "http://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastn&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome"
        webopen(BLASTn_url, new = 2, autoraise = True)

    def _BLAST(self, event):
        self.tb.delete(0.0,END)
        gene_name = self.sp_name_e.get()
        species = self.bsp_var.get()
        ev_cutoff = float(self.ev_cutoff.get())
        cov_cutoff = float(self.cov_cutoff.get())

        if species == '5':
            self.tb.delete(0.0, END)
            self.tb.insert(END, 'Please choose a target species.')
        elif gene_name == '':
            self.tb.delete(0.0, END)
            self.tb.insert(END, 'Please enter a gene identifier.')
        else:
            output = BLAST_by_sp(gene_name, species, cov_cutoff, ev_cutoff)
            self.tb.delete(0.0, END)
            if output == []:
                self.tb.delete(0.0, END)
                self.tb.insert(END, 'No significant hit found.')
            elif output == 'NoName':
                self.tb.delete(0.0, END)
                self.tb.insert(END, 'There is no gene called "%s" in S. pombe.' % gene_name)
                self.tb.insert(END, str(output))
            else:
                self.tb.delete(0.0, END)
                for hit in output:
                    msg = "E-value: {}\tCov%: {:.2f}\tIdent%: {:.2f}\n".format(hit[0], hit[1], hit[2])
                    for cds in hit[3:]:
                        msg += '\t'.join(cds) + '\n'
                    self.tb.insert(END, msg)

    def _layout_primerDesign(self):
        self.options = Frame(self.total)
        self.options.pack(pady = 5, padx = 10, side = RIGHT)

        self.entries = Frame(self.options)
        self.entries.pack(fill = X, pady = 5)
        
        self._layout_primerDesign_line1()
        self._layout_primerDesign_line2()
        self._layout_primerDesign_line3()
        self._layout_primerDesign_line4_1()
        self._layout_primerDesign_line4_2()
        
        self.frmbt = Frame(self.options)
        self.frmbt.pack(pady = 5, fill = X, side = BOTTOM)
        
        self.b1 = Button(self.frmbt, text = 'Get Primer', font = ("Arial", 12))
        self.b1.bind("<Return>", self.getPrimer)
        self.b1.bind("<Button-1>", self.getPrimer)
        self.b1.pack(side = LEFT, pady = 5, ipady = 1, ipadx = 1)
        
        self.b2 = Button(self.frmbt, 
                         text = 'Get Checking Primers', 
                         font = ("Arial", 12))
        self.b2.bind("<Button-1>", self.openCheckPrimerWindow)

    def _layout_bottom(self):

        primer_result = Frame(self.root)
        primer_result.pack(pady = 5)

        rtf = Frame(primer_result) # result title frame
        rtf.pack(fill = X)
        
        result_title = Label(rtf, 
                             text = 'The primer we get is following:', 
                             font = ("Arial", 11))
        result_title.pack(side = LEFT)

        rcf = Frame(primer_result) # result content frame
        rcf.pack(fill = X)
        
        self.t = Text(rcf, width = 125, height = 5)
        self.t.pack(side = LEFT, fill = Y, expand = YES)
        
        scr = Scrollbar(rcf)
        scr.pack(side = RIGHT, fill = Y)
        self.t["yscrollcommand"] = scr.set
        scr['command'] = self.t.yview

    def _layout_primerDesign_line1(self):
        l2 = Label(self.entries, 
                   text = 'Accession ID for all or \ngene symbol in S. pombe:', 
                   font = ("Arial", 10), width = 20)
        l2.pack(side = LEFT)
        
        self.e2 = Entry(self.entries, width = 14)
        self.e2.bind("<Return>", self.getPrimer)
        self.e2.bind("<Key>", self._forgetb2)
        self.e2.pack(side = LEFT)
        
        l3 = Label(self.entries, text = 'length:',
                   font = ("Arial", 10), width = 6)
        l3.pack(side = LEFT)
        
        self.e3 = Entry(self.entries, width = 3)
        self.e3.insert(0, '80')
        self.e3.bind("<Return>", self.getPrimer)
        self.e3.bind("<Key>", self._forgetb2)
        self.e3.pack(side = LEFT)

    def _layout_primerDesign_line2(self):
        check_species = Frame(self.options)
        check_species.pack(fill = X, pady = 5)
        
        sp = Label(check_species, text = 'Species:', 
                   font = ("Arial", 10), width = 6)
        sp.pack(side = LEFT)
        
        self.species_var = StringVar()
        self.species_var.set(1)
        Issp = Radiobutton(check_species, text = "S. pombe", 
                           variable = self.species_var, value = "P")
        Issp.bind("<Button-1>", self._getfocusback)
        Issp.pack(side = LEFT)
        Issj = Radiobutton(check_species, text = "S. japonicus", 
                           variable=self.species_var, value = "J")
        Issj.bind("<Button-1>", self._getfocusback)
        Issj.pack(side = LEFT)
        Issc = Radiobutton(check_species, text = "S. cryophilus", 
                           variable = self.species_var, value = "C")
        Issc.bind("<Button-1>", self._getfocusback)
        Issc.pack(side = LEFT)
        Isso = Radiobutton(check_species, text = "S. octosporus", 
                           variable = self.species_var, value = "O")
        Isso.bind("<Button-1>", self._getfocusback)
        Isso.pack(side = LEFT)

    def _layout_primerDesign_line3(self):
        self.check_mode = Frame(self.options)
        self.check_mode.pack(fill = X, pady = 5)
        
        self.mode_var = StringVar()
        self.mode_var.set(2)
        md = Label(self.check_mode, text = 'Fuction:', 
                   font = ("Arial", 10), width = 6)
        md.pack(side = LEFT)
        Isdel = Radiobutton(self.check_mode,text = "Deletion", 
                            variable = self.mode_var, value="del", 
                            command = self._choose_plasmid)
        Isdel.bind("<Button-1>", self._getfocusback)
        Isdel.pack(side = LEFT)
        IsC = Radiobutton(self.check_mode, text = "C-terminal Tagging", 
                          variable = self.mode_var, value = "C", 
                          command = self._choose_Ctag)
        IsC.bind("<Button-1>", self._getfocusback)
        IsC.pack(side = LEFT)
        IsN = Radiobutton(self.check_mode, text = "N-terminal promoter adding", 
                          variable = self.mode_var, value = "N", 
                          command = self._choose_Ntag)
        IsN.bind("<Button-1>", self._getfocusback)
        IsN.pack(side = LEFT)

    def _layout_primerDesign_line4_1(self):
        self.blankframe = Frame(self.options)
        self.blankframe.pack(after = self.check_mode, pady = 18)
        
        self.check_plsmd = Frame(self.options)
        self.check_plsmd.pack(after = self.check_mode, pady = 5)
        self.check_plsmd.forget()
        
        pl = Label(self.check_plsmd, text = 'Plasmid:', 
                   font = ("Arial", 10), width = 10)
        pl.pack(side = LEFT)
        self.plasmid_var = StringVar()
        self.plasmid_var.set(3)
        IspFA6a = Radiobutton(self.check_plsmd, text = "pFA6a", 
                              variable = self.plasmid_var, value = 'pFA6a')
        IspFA6a.bind("<Button-1>", self._getfocusback)
        IspFA6a.pack(side = LEFT)
        IsKS = Radiobutton(self.check_plsmd, text = "KS-ura4", 
                           variable = self.plasmid_var, value = 'KS-ura4')
        IsKS.bind("<Button-1>", self._getfocusback)
        IsKS.pack(side = LEFT)

    def _layout_primerDesign_line4_2(self):
        self.check_Ntag = Frame(self.options)
        self.check_Ntag.pack(after = self.check_mode, pady = 5)
        self.check_Ntag.forget()
        
        nt = Label(self.check_Ntag, text = 'N-terminal Tag:', 
                   font = ("Arial", 10), width = 10)
        nt.pack(side = LEFT)
        
        self.Ntag_var = StringVar()
        self.Ntag_var.set(' ')
        Isnone = Radiobutton(self.check_Ntag, text = "None", 
                           variable = self.Ntag_var, value = ' ')
        Isnone.bind("<Button-1>", self._getfocusback)
        Isnone.pack(side=LEFT)
        Is3HA = Radiobutton(self.check_Ntag, text = "3HA", 
                          variable = self.Ntag_var, value = '3HA')
        Is3HA.bind("<Button-1>", self._getfocusback)
        Is3HA.pack(side = LEFT)
        IsGST = Radiobutton(self.check_Ntag, text = "GST", 
                          variable = self.Ntag_var, value = 'GST')
        IsGST.bind("<Button-1>", self._getfocusback)
        IsGST.pack(side = LEFT)
        IsGFP = Radiobutton(self.check_Ntag, text = "GFP", 
                            variable = self.Ntag_var, value = 'GFP')
        IsGFP.bind("<Button-1>", self._getfocusback)
        IsGFP.pack(side = LEFT)

    def _choose_Ntag(self):
        self.blankframe.forget()
        self.check_plsmd.forget()
        self.check_Ntag.pack(after = self.check_mode, pady = 5)

    def _choose_plasmid(self):
        self.blankframe.forget()
        self.check_Ntag.forget()
        self.check_plsmd.pack(after = self.check_mode, pady = 5)

    def _choose_Ctag(self):
        self.blankframe.pack(pady = 18)
        self.check_Ntag.forget()
        self.check_plsmd.forget()

    def _noResultMsg(self, keyword, species):
        self.t.delete(0.0, END)
        self.t.insert(END, 
            "No gene matches \"{}\" in {}.".format(keyword, species))

    def _ambResultMsg(self, keyword, species, results):
        self.t.delete(0.0, END)
        nResult, dfRepr = formatMultiResult(results)
        self.t.insert(END, 
            "{0} entries found to match \"{1}\" in {2}:\n{3}".format(nResult, keyword, species, dfRepr))

    def getPrimer(self, event):
        self.b1.focus_set()
        mode = self.mode_var.get()
        species = self.species_var.get()
        gene = self.e2.get()
        plasmid = self.plasmid_var.get()

        if mode != 'del':
            plasmid = 'pFA6a'

        if species == "1" or mode == "2" or plasmid == "3":
            self.t.delete(0.0, END)
            self.t.insert(END, "Please check all the radiobutton needed!\n")
        else:
            fullSpeciesNameMap = {'P': 'S. pombe', 'J': 'S. japonicus', 
                            'C': 'S. cryophilus', 'O': 'S. octosporus'}
            fullSpeciesName = fullSpeciesNameMap[species]
            
            Ntag = self.Ntag_var.get()
            length = int(self.e3.get())
            
            if plasmid == "pFA6a":
                forward_plmd_del = "CGGATCCCCGGGTTAATTAA"
                reverse_plmd_del = "GAATTCGAGCTCGTTTAAAC"
                forward_plmd_N = "GAATTCGAGCTCGTTTAAAC"
                reverse_plmd_N = "CATGATTTAACAAAGCGACTATA"
                reverse_plmd_N_3HA = "GCACTGAGCAGCGTAATCTG"
                reverse_plmd_N_GST = "ACGCGGAACCAGATCCGATT"
                reverse_plmd_N_GFP = "TTTGTATAGTTCATCCATGC"
            elif plasmid == "KS-ura4":
                forward_plmd_del = "CGCCAGGGTTTTCCCAGTCACGAC"
                reverse_plmd_del = "AGCGGATAACAATTTCACACAGGA"

            if mode == 'del':
                primer = get_del_primer(species, gene, length)
                if primer == []:
                    self._noResultMsg(gene, fullSpeciesName)
                elif type(primer) == list and len(primer) > 1:
                    self._ambResultMsg(gene, fullSpeciesName, primer)
                else:
                    self.t.delete(0.0, END)
                    self.t.insert(END, 'Found gene: {}, GenBank: {}, systematic ID: {}\n'.format(primer[2][0], primer[2][1], primer[2][2]))
                    self.t.insert(END, 'Forward primer: {} - {}\n'.format(primer[0], forward_plmd_del))
                    self.t.insert(END, '                %GC content = {} TM = {}\n'.format(GC(primer[0] + forward_plmd_del), TM(primer[0] + forward_plmd_del)))
                    self.t.insert(END, 'Reverse primer: {} - {}\n'.format(primer[1], reverse_plmd_del))
                    self.t.insert(END, '                %GC content = {} TM = {}'.format(GC(primer[1] + reverse_plmd_del), TM(primer[1] + reverse_plmd_del)))
                    self.b2.pack(side = LEFT, pady = 5, padx = 7, ipady = 1, ipadx = 1)
                    self.b2.focus_set()
            elif mode == 'C':
                primer = get_Ctag_primer(species, gene, length)
                if primer == []:
                    self._noResultMsg(gene, fullSpeciesName)
                elif type(primer) == list and len(primer) > 1:
                    self._ambResultMsg(gene, fullSpeciesName, primer)
                else:
                    self.t.delete(0.0, END)
                    self.t.insert(END, 'Found gene: {}, GenBank: {}, systematic ID: {}\n'.format(primer[2][0], primer[2][1], primer[2][2]))
                    self.t.insert(END, 'Forward primer: {} - {}\n'.format(primer[0], forward_plmd_del))
                    self.t.insert(END, '                %GC content = {} TM = {}\n'.format(GC(primer[0] + forward_plmd_del), TM(primer[0] + forward_plmd_del)))
                    self.t.insert(END, 'Reverse primer: {} - {}\n'.format(primer[1], reverse_plmd_del))
                    self.t.insert(END, '                %GC content = {} TM = {}'.format(GC(primer[1] + reverse_plmd_del), TM(primer[1] + reverse_plmd_del)))
                    self.b2.pack(side = LEFT, pady = 5, padx = 7, ipady = 1, ipadx = 1)
                    self.b2.focus_set()
            elif mode == 'N':
                if Ntag == ' ':
                    primer = get_Ntag_none_primer(species, gene,length)
                else:
                    primer = get_Ntag_tag_primer(species, gene,length)
                    if Ntag == "3HA":
                        reverse_plmd_N = reverse_plmd_N_3HA
                    elif Ntag == "GST":
                        reverse_plmd_N = reverse_plmd_N_GST
                    elif Ntag == "GFP":
                        reverse_plmd_N = reverse_plmd_N_GFP
                if primer == []:
                    self._noResultMsg(gene, fullSpeciesName)
                elif type(primer) == list and len(primer) > 1:
                    self._ambResultMsg(gene, fullSpeciesName, primer)
                else:
                    self.t.delete(0.0, END)
                    self.t.insert(END, 'Found gene: {}, GenBank: {}, systematic ID: {}\n'.format(primer[2][0], primer[2][1], primer[2][2]))
                    self.t.insert(END, 'Forward primer: {} - {}\n'.format(primer[0], forward_plmd_N))
                    self.t.insert(END, '                %GC content = {} TM = {}\n'.format(GC(primer[0] + forward_plmd_N), TM(primer[0] + forward_plmd_N)))
                    self.t.insert(END, 'Reverse primer: {} - {}\n'.format(primer[1], reverse_plmd_N))
                    self.t.insert(END, '                %GC content = {} TM = {}'.format(GC(primer[1] + reverse_plmd_N), TM(primer[1] + reverse_plmd_N)))
                    self.b2.pack(side = LEFT, pady = 5, padx = 7, ipady = 1, ipadx = 1)
                    self.b2.focus_set()

    def _backtob3(self, event):
        self.b3.focus_set()

    def _focusB(self, event):
        self.button_blast.focus_set()

    def _getfocusback(self, event):
        self.b1.focus_set()
        self.b2.forget()

    def _forgetb2(self, event):
        self.b2.forget()

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

    def openCheckPrimerWindow(self, event):
        CheckPrimerWindow(self)