コード例 #1
1
class Loadbar:
    def __init__(self,size):
        self.loadbar = Tk()
        self.loadbar.wm_title('Loading')
        self.pgb = Progressbar(self.loadbar,orient='horizontal',length='500',maximum=int(size))
        self.pgb.pack()
        self.pgb.start()
    def start(self):
        self.loadbar.mainloop()
    def kill(self):
        self.loadbar.destroy()
コード例 #2
0
 def popupWindow(self):
     self.popup = Toplevel(self.root)
     self.popup.title("Progress window")
     self.popup.geometry("200x50")  
     self.popup.focus()
     self.counter = IntVar()
     self.counter.set(0)
     #label = Label(self.popup, textvariable = self.strVar)
     #label.pack(expand=True)
     pb = Progressbar(self.popup, mode="determinate", orient="horizontal", variable=self.counter, maximum=1000000)
     pb.start()
     pb.pack(expand=True)
     
     self.root.after(100, self.read_queue)
コード例 #3
0
ファイル: auto_mailer.py プロジェクト: pokk/Mailer
class AppGUI(Frame):
    def __init__(self, master=None):
        # Avoiding to send it continuously.
        self.lock = False

        Frame.__init__(self, master)
        self.grid()
        self.master = master
        # Setting for ComboBox.
        self.url_lang_combobox_str = StringVar()
        self.url_lang_combobox_list = lang_list
        # UI components.
        self.receiver_email_text = Label(self, text="Receiver:")
        self.receiver_email_field = Entry(self, width=50)
        self.subject_text = Label(self, text='Subject:')
        self.subject_field = Entry(self, width=50)
        self.receiver_name_text = Label(self, text='Name:')
        self.receiver_name_field = Entry(self, width=50)
        self.url_lang_text = Label(self, text='Link lang:')
        self.url_lang_combobox = Combobox(self, textvariable=self.url_lang_combobox_str, values=self.url_lang_combobox_list, state='readonly')
        self.send_progressbar = Progressbar(self, orient='horizontal', length=500, mode='determinate', maximum=300)
        self.send_button = Button(self, text='Send', command=self._send_mail)
        self.quit_button = Button(self, text='Exit', command=self.__exit)
        self.log_msg_text = ScrolledText(self)
        # Attachment.
        self.mail_attachment_list = attachment_list[:]
        self.url_lang_link_title = None
        self.url_lang_link = copy.deepcopy(content_link)
        # Mailer
        self._mailer = None

        # Let Mailer can control components.
        Mailer.window_content = self

        self.__create_widgets()

    def _send_mail(self):
        if not self.lock:
            threading.Thread(target=self.__send_mail).start()
        else:
            messagebox.showinfo('Warning', "Now it's processing...")

    def _choose(self, event):
        # arr = self.url_lang_link.get(self.url_lang_combobox_str.get())  # Get the array by choosing language.
        pass

    def _modify_content_url_link(self):
        link_arr = self.url_lang_link.get(self.url_lang_combobox_str.get())
        content = self._mailer.content
        for index in range(len(link_arr)):
            content_index = content.index(self.url_lang_link_title[index]) + len(self.url_lang_link_title[index])
            content = content[:content_index] + '\n' + link_arr[index] + content[content_index:]

        self._mailer.content = content
        return False

    def _make_mailer(self):
        self.mail_attachment_list = attachment_list[:]  # Clone a list.
        if atta_lang_list[self.url_lang_combobox.current()]:
            for i in range(len(self.mail_attachment_list)):
                # Only from the third file to the end file can change language.
                if i > 2:
                    # Modify the file name.
                    att = self.mail_attachment_list[i].split('.')
                    self.mail_attachment_list[i] = ''.join([' ', atta_lang_list[self.url_lang_combobox.current()], '.']).join(att)

        # ** IMPORTANT, we set the content path here!!
        path = 'content.docx'
        if self.url_lang_combobox.get() == lang_list[2] or self.url_lang_combobox.get() == lang_list[3]:
            path = 'content chinese.docx'
        if debug_log:
            print(self.mail_attachment_list)

        # ** IMPORTANT, we have to new an object here. Otherwise, we couldn't check the error checking.
        return Mailer(content_path=path, attachment_list=self.mail_attachment_list)

    def __create_widgets(self):
        """
        Construct all of the UI components.
        """

        self.receiver_email_text.grid(row=0, column=0)
        self.receiver_email_field.grid(row=0, column=1, columnspan=6)
        self.subject_text.grid(row=1, column=0)
        self.subject_field.grid(row=1, column=1, columnspan=6)
        self.subject_field.insert(0, 'Osaka Mariko Apartment Location & Condition')
        self.receiver_name_text.grid(row=2, column=0)
        self.receiver_name_field.grid(row=2, column=1, columnspan=6)
        self.url_lang_text.grid(row=3, column=0)
        self.url_lang_combobox.grid(row=3, column=2, columnspan=2)
        self.send_progressbar.grid(row=4, column=0, columnspan=7)
        self.send_button.grid(row=5, column=2)
        self.quit_button.grid(row=5, column=3)
        self.log_msg_text.grid(row=6, column=0, columnspan=7)

        # Default setting.
        self.url_lang_combobox.current(0)
        self.url_lang_combobox.bind("<<ComboboxSelected>>", self._choose)

    def __exit(self):
        if not self.lock:
            self.log_msg_text.insert(END, '\n\n -- Bye Bye --\n')
            self.master.quit()
        else:
            messagebox.showinfo('Error', "Now it's processing...please wait it ;)")

    @DecoratorThreadLockerApp()
    @DecoratorErrorCheckAndInitApp()
    def __send_mail(self):
        self.send_progressbar.start()  # Start processing the progress.
        ending = 'Welcome to use my application :)' if self._mailer.send_mail() \
            else '** Your sending was failed :( please send it again!'
        self.log_msg_text.insert(END, ending)
        self.send_progressbar.stop()  # Stop processing the progress.
コード例 #4
0
class qbtConvertor(Tk):
    """ GUI Application for migration from uTorrent to qBittorrent """
    def __init__(self):
        Tk.__init__(self)
        self.title("uT to qBt convertor")

        #main frame
        self.main_frame = Frame(self, padding="3 3 12 12")
        self.main_frame.grid(column=0, row=0, sticky=(N, W, E, S))
        self.main_frame.columnconfigure(0, weight=1)
        self.main_frame.rowconfigure(0, weight=1)

        #uT part
        self.ut_data = StringVar()
        self.ut_label = Label(self.main_frame, text="uT data")
        self.ut_label.grid(column=0, row=1, sticky=(W))
        self.ut_entry = Entry(self.main_frame, width=100, textvariable=self.ut_data)
        self.ut_entry.grid(column=1, row=1, sticky=(W))
        self.ut_button = Button(self.main_frame, text="Browse", command=self.load_file)
        self.ut_button.grid(column=2, row=1)

        #qBt part
        self.qbt_folder = StringVar()
        self.qbt_label = Label(self.main_frame, text="qBt folder")
        self.qbt_label.grid(column=0, row=4, sticky=(W))
        self.qbt_entry = Entry(self.main_frame, width=100, textvariable=self.qbt_folder)
        self.qbt_entry.grid(column=1, row=4, sticky=(W))
        self.qbt_button = Button(self.main_frame, text="Browse", command=self.open_dir)
        self.qbt_button.grid(column=2, row=4, sticky=(W, E))


        #convertor
        self.convertor_button = Button(self.main_frame, text="Convert", command=self.convert,
                                       width=50)
        self.convertor_button.grid(column=1, columnspan=2, row=5)

        self.progress_bar = Progressbar(self.main_frame, orient=HORIZONTAL, length=300, mode="indeterminate")
        self.progress_bar.grid(column=1, columnspan=3, row=6)

        #set padding for each element
        for child in self.main_frame.winfo_children():
            child.grid_configure(padx=5, pady=5)

    def convert(self):
        message = messagebox
        if not self.qbt_folder.get() or not self.ut_data.get():
            message.showerror("ERROR", "Specify paths!")
            return
        self.progress_bar.start()
        convertor(self.ut_data.get(), self.qbt_folder.get())
        self.progress_bar.stop()

    def load_file(self):
        file_name = filedialog.askopenfilename(filetypes=(("UT resume file", "*.dat"),
                                                          ("All", "*")))
        if file_name:
            self.ut_data.set(file_name)

    def open_dir(self):
        dir_name = filedialog.askdirectory()

        if dir_name:
            self.qbt_folder.set(dir_name)
コード例 #5
0
class BCR_UI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.withdraw()
        splash = Splash(self)

        ## setup stuff goes here
        self.title("Bar Chart Race")
        ## simulate a delay while loading
        time.sleep(3)

        ## finished loading so destroy splash
        splash.destroy()

        ## show window again
        self.deiconify()

        self.geometry("800x800")

        self.bg_color = "#CDDDFD"
        self.btn_color = "#0556F3"
        self.hint_color = "#464646"

        self.details_frame = tk.LabelFrame(self,
                                           text="Get Details",
                                           bg=self.bg_color,
                                           bd=2)
        self.details_frame.pack(fill="both", expand="yes")

        self.parameter_frame = tk.LabelFrame(self,
                                             text="Enter Parameters",
                                             bg=self.bg_color,
                                             bd=2)
        self.parameter_frame.pack(fill="both", expand="yes")

        self.advanced_frame = tk.LabelFrame(self,
                                            text="Advanced Options",
                                            bg=self.bg_color,
                                            bd=2,
                                            height=65)
        self.advanced_frame.pack(fill="both", )

        self.run_frame = tk.LabelFrame(self,
                                       text="Create Video",
                                       bg=self.bg_color,
                                       bd=2,
                                       height=65)
        self.run_frame.pack(fill="both", )

        self.configure(bg=self.bg_color)
        self.i_flag = False
        self.s_flag = False
        self.c_flag = False
        self.d_flag = False
        '''
        Adjustable parameters
        '''
        # get title
        self.title_entry = tk.Entry(self.parameter_frame,
                                    textvariable=StringVar(self, value=''))
        self.title_entry.place(relx=0.6, rely=0.1)

        # get colors
        self.color_entry = tk.Entry(
            self.parameter_frame,
            textvariable=StringVar(self,
                                   value="#6ECBCE,#FF2243,#FFC33D,#CE9673"))
        self.color_entry.place(relx=0.6, rely=0.3)

        # get fps
        optionListFps = [24, 30, 60]
        self.dropVarFps = StringVar()
        self.dropVarFps.set(optionListFps[0])
        self.fps_option = tk.OptionMenu(
            self.parameter_frame,
            self.dropVarFps,
            *optionListFps,
        )
        self.fps_option.place(relx=0.6, rely=0.5)

    # call main.py
    def createVideo(self):
        def creation():
            # check if data is uploaded
            if self.d_flag == False:
                messagebox.showwarning("showwarning", "Data is not uploaded")
            else:

                main.BCR_Main(file_path=self.path,
                              image_path=self.i_path,
                              save_location=self.location,
                              title_name=self.title_entry.get(),
                              bar_size=self.advanced_data.get('bar_thickness'),
                              color_palette=self.color_entry.get().split(","),
                              bar_label_text_type=self.advanced_data.get(
                                  'bar_label_text_type'),
                              text_after_bar_label=self.advanced_data.get(
                                  'text_after_bar_label'),
                              fps=self.dropVarFps.get())

            # self.progress['value'] = 100
            msg = messagebox.askquestion(
                "Done",
                "Video created!!! Do you want to open the video location?",
                icon='info')
            if msg == 'yes':
                if self.s_flag == False:
                    subprocess.Popen(["open", os.path.abspath(os.getcwd())])
                else:
                    subprocess.Popen(["open", self.location])

            self.progress.destroy()

        def progress_bar():
            self.progress = Progressbar(self.run_frame,
                                        orient=HORIZONTAL,
                                        length=200,
                                        mode='indeterminate')
            self.progress.place(relx=0.6, rely=0.3)
            self.progress.start(interval=300)
            # self.progress['value'] = 20
            time.sleep(5)

        t1 = threading.Thread(target=progress_bar)
        t1.start()
        t2 = threading.Thread(target=creation)
        t2.start()

    @property
    def advanced_data(self):
        options = {}
        try:
            options['bar_thickness'] = float(self.PopupWindow.bar_size.get())
            options[
                'text_after_bar_label'] = self.PopupWindow.text_after_bar_label.get(
                )
            options['bar_label_text_type'] = self.PopupWindow.dropVar.get()
        except Exception as e:
            options['bar_thickness'] = 0.95
            options['text_after_bar_label'] = ''
        return options

    # browser button: upload data
    def uploadData(self):
        btn = tk.Button(
            self.details_frame,
            text="Upload Data",
            command=self.browseData,
        )
        btn.place(relx=0.1, rely=0.1)
        label = tk.Label(
            self.details_frame,
            text="*The data should be in csv format. eg. data.csv",
            bg=self.bg_color,
            fg=self.hint_color)
        label.place(relx=0.1, rely=0.21)

    def browseData(self):
        self.d_flag = True
        file = filedialog.askopenfilename(filetypes=(("CSV Files", "*.csv"), ))
        if (file):
            label = tk.Label(self.details_frame,
                             text=ntpath.basename(file),
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.1)
            self.path = file
        else:
            self.d_flag = False
            label = tk.Label(self.details_frame,
                             text="You have not selected any file.",
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.1)

    # button: select image folder
    def uploadImages(self):
        btn = tk.Button(
            self.details_frame,
            text="Upload Image Folder",
            command=self.browseImages,
        )
        btn.place(relx=0.1, rely=0.3)
        label = tk.Label(
            self.details_frame,
            text=
            "*The name of each image should match the column name in the data.\neg. If column name is 'Python', the image name must be 'Python.png'",
            bg=self.bg_color,
            fg=self.hint_color)
        label.place(relx=0.1, rely=0.41)

    def browseImages(self):
        i_flag = True
        directory = filedialog.askdirectory()
        if (directory):
            label = tk.Label(self.details_frame,
                             text=ntpath.basename(directory),
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.3)
            self.i_path = directory
        else:
            self.i_path = None
            label = tk.Label(self.details_frame,
                             text="You have not selected any folder.",
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.3)

    # button: select location to save the video
    def saveLocation(self):
        btn = tk.Button(
            self.details_frame,
            text="Choose Video Destination",
            command=self.browseLocation,
        )
        btn.place(relx=0.1, rely=0.55)
        label = tk.Label(self.details_frame,
                         text="*Choose a folder to save the video.",
                         bg=self.bg_color,
                         fg=self.hint_color)
        label.place(relx=0.1, rely=0.65)

    def browseLocation(self):
        s_flag = True
        directory = filedialog.askdirectory()
        if (directory):
            label = tk.Label(self.details_frame,
                             text=ntpath.basename(directory),
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.55)
            self.location = directory
        else:
            self.location = None
            label = tk.Label(self.details_frame,
                             text="You have not selected any location.",
                             bg=self.bg_color)
            label.place(relx=0.6, rely=0.55)

    '''
    Parameter labels
    '''

    # title
    def titleEntry(self):
        label_1 = tk.Label(self.parameter_frame,
                           text="Title",
                           bg=self.bg_color)
        label_1.place(relx=0.1, rely=0.1)
        label_2 = tk.Label(
            self.parameter_frame,
            text="*Text that appears at the top of the Video as a heading.",
            bg=self.bg_color,
            fg=self.hint_color)
        label_2.place(relx=0.1, rely=0.2)

    # color entry
    def colorsEntry(self):
        label_1 = tk.Label(self.parameter_frame,
                           text="Color palette",
                           bg=self.bg_color)
        label_1.place(relx=0.1, rely=0.3)
        label_2 = tk.Label(
            self.parameter_frame,
            text=
            "*Enter the hex code of colors separated by a comma. eg: #6ECBCE,#FF2243",
            bg=self.bg_color,
            fg=self.hint_color)
        label_2.place(relx=0.1, rely=0.4)

    # get fps
    def fpsEntry(self):
        label_1 = tk.Label(self.parameter_frame, text="FPS", bg=self.bg_color)
        label_1.place(relx=0.1, rely=0.5)
        label_2 = tk.Label(self.parameter_frame,
                           text="*Fps of the video. Default is 30",
                           bg=self.bg_color,
                           fg=self.hint_color)
        label_2.place(relx=0.1, rely=0.6)

    # button: advance options
    def advancedButton(self):
        btn = tk.Button(self.advanced_frame,
                        text="Select Advanced Options",
                        command=self.popup,
                        bg=self.btn_color)
        # btn = tk.Button(self, text="Create Video", command=self.createVideo, highlightbackground=self.btn_color)   # for mac
        btn.place(relx=0.35, rely=0.2)

    def popup(self):
        self.PopupWindow = PopupWindow(self.advanced_data)
        self.PopupWindow.deiconify()

    # button: run button
    def runButton(self):
        btn = tk.Button(self.run_frame,
                        text="Create Video",
                        command=self.createVideo,
                        bg=self.btn_color)
        # btn = tk.Button(self, text="Create Video", command=self.createVideo, highlightbackground=self.btn_color)   # for mac
        btn.place(relx=0.4, rely=0.2)

    def execution(self):

        # check if browse image button is clicked
        if self.i_flag == False:
            self.i_path = None

        # check if browse saving button is clicked
        if self.s_flag == False:
            self.location = None

        self.uploadData()
        self.uploadImages()
        self.saveLocation()
        self.titleEntry()
        self.colorsEntry()
        self.advancedButton()
        self.fpsEntry()
        self.runButton()
        self.mainloop()
コード例 #6
0
ファイル: 1_calculating_pi.py プロジェクト: chengyi818/kata
class Example(Frame):
    def __init__(self, parent, q):
        Frame.__init__(self, parent)
        self.queue = q
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Pi computation")
        self.pack(fill=BOTH, expand=True)

        self.grid_columnconfigure(4, weight=1)
        self.grid_rowconfigure(3, weight=1)

        lbl1 = Label(self, text="Digits:")
        lbl1.grid(row=0, column=0, sticky=E, padx=10, pady=10)

        self.ent1 = Entry(self, width=10)
        self.ent1.insert(END, "4000")
        self.ent1.grid(row=0, column=1, sticky=W)

        lbl2 = Label(self, text="Accuracy:")
        lbl2.grid(row=0, column=2, sticky=E, padx=10, pady=10)

        self.ent2 = Entry(self, width=10)
        self.ent2.insert(END, "100")
        self.ent2.grid(row=0, column=3, sticky=W)

        self.startBtn = Button(self, text="Start",
                               command=self.onStart)
        self.startBtn.grid(row=1, column=0, padx=10, pady=5, sticky=W)

        self.pbar = Progressbar(self, mode='indeterminate')
        self.pbar.grid(row=1, column=1, columnspan=3, sticky=W+E)

        self.txt = scrolledtext.ScrolledText(self)
        self.txt.grid(row=2, column=0, rowspan=4, padx=10, pady=5,
                      columnspan=5, sticky=E+W+S+N)

    def onStart(self):
        self.startBtn.config(state=DISABLED)
        self.txt.delete("1.0", END)

        self.digits = int(self.ent1.get())
        self.accuracy = int(self.ent2.get())

        self.p1 = Process(target=self.generatePi, args=(self.queue,))
        self.p1.start()
        self.pbar.start(DELAY2)
        self.after(DELAY1, self.onGetValue)

    def onGetValue(self):
        if (self.p1.is_alive()):
            self.after(DELAY1, self.onGetValue)
            return
        else:
            try:
                self.txt.insert('end', self.queue.get(0))
                self.txt.insert('end', "\n")
                self.pbar.stop()
                self.startBtn.config(state=NORMAL)
            except queue.Empty:
                print("queue is empty")

    def generatePi(self, queue):
        getcontext().prec = self.digits
        time.sleep(10)

        pi = Decimal(0)
        k = 0
        n = self.accuracy

        while k < n:
            pi += (Decimal(1)/(16**k))*((Decimal(4)/(8*k+1)) -
                                        (Decimal(2)/(8*k+4)) -
                                        (Decimal(1)/(8*k+5)) -
                                        (Decimal(1)/(8*k+6)))
            k += 1
            print(self.p1.is_alive())

        queue.put(pi)
        print("end")
コード例 #7
0
ファイル: Window.py プロジェクト: sdimka/PyEZ_tests
class SubFrame(Frame):
    def __init__(self, parent, name, param1, param2):
        super().__init__(parent)
        self.parent = parent

        self.name = name
        self.param1 = StringVar()
        self.param1.set(param1)
        self.param2 = StringVar()
        self.param2.set(param2)
        self.param3 = StringVar()
        # self.param3.set(param3)
        self.status = False

        handler_start = partial(self.runProgress, message='Text')
        self.bind('<<UpdateStart>>', handler_start)
        handler_stop = partial(self.stopProgress)
        self.bind('<<UpdateStop>>', handler_stop)

        self.img_bad = PhotoImage(file='bad.png')
        self.img_good = PhotoImage(file='good.png')
        self.img_err = PhotoImage(file='bad_conn.png')
        self.img_wrongGW = PhotoImage(file='error.png')

        self.initUI()

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

        self['padding'] = (5, 10)
        self['borderwidth'] = 4
        self['relief'] = 'ridge'

        self.lbl0 = Label(self, image=self.img_bad)
        self.lbl0.image = self.img_bad
        self.lbl0.grid(row=0, column=0, rowspan=2, sticky=W, pady=1, padx=5)

        lbl = Label(self, text=self.name)
        lbl.grid(row=0, column=1, sticky=W, pady=1, padx=5)

        self.lbl1a = Label(self,
                           text='IP',
                           foreground="blue",
                           font='TkDefaultFont 12 bold')
        self.lbl1a.grid(row=0, column=2, sticky=N, pady=1, padx=5)

        self.lbl1 = Label(self, textvariable=self.param1, foreground="blue")
        self.lbl1.grid(row=1, column=2, sticky=W, pady=1, padx=5)

        self.lbl2a = Label(self, text='G/W', font='TkDefaultFont 12 bold')
        self.lbl2a.grid(row=0, column=3, sticky=N, pady=1, padx=5)

        self.lbl2 = Label(self, textvariable=self.param2)
        self.lbl2.grid(row=1, column=3, sticky=W, pady=1, padx=5)

        self.lbl3a = Label(self,
                           text='Last error:',
                           font='TkDefaultFont 12 bold')
        self.lbl3a.grid(row=0, column=4, sticky=N, pady=1, padx=5)

        self.lbl3 = Label(self, textvariable=self.param3)
        self.lbl3.grid(row=1, column=4, sticky=W, pady=1, padx=5)

        self.abtn = Button(self, text="Connect")
        self.abtn.grid(row=0, column=5)

        self.bbtn = Button(self, text="Disconnect", command=self.onClick)
        self.bbtn.grid(row=0, column=6)

        self.cbtn = Button(self, text="Get GW", command=self.runProgress)
        self.cbtn.grid(row=1, column=5, pady=4)

        self.dbtn = Button(self, text="Res OSPF", command=self.onClick)
        self.dbtn.grid(row=1, column=6, pady=4)

        self.pbar = Progressbar(self, mode='indeterminate')
        self.pbar.grid(row=1, column=1, sticky=W + E)  # columnspan=4

    def onClick(self):
        self.setGood()
        # self.lbl0.config(image=self.img_good)
        # self.lbl0.image = self.img_good

    def runProgress(self, event, message):
        self.pbar.start()

    def stopProgress(self, event):
        self.pbar.stop()

    def setGood(self):
        self.lbl0.config(image=self.img_good)
        self.lbl0.image = self.img_good
        self.abtn.config(state="disabled")
        self.bbtn.config(state="normal")
        self.cbtn.config(state="normal")
        self.dbtn.config(state="normal")

    def setBad(self):
        self.lbl0.config(image=self.img_bad)
        self.lbl0.image = self.img_bad
        self.abtn.config(state="normal")
        self.bbtn.config(state="disabled")
        self.cbtn.config(state="disabled")
        self.dbtn.config(state="disabled")

    def setError(self):
        self.lbl0.config(image=self.img_err)
        self.lbl0.image = self.img_err
        self.abtn.config(state="normal")
        self.bbtn.config(state="disabled")
        self.cbtn.config(state="disabled")
        self.dbtn.config(state="disabled")

    def setWrongGW(self):
        self.lbl0.config(image=self.img_wrongGW)
        self.lbl0.image = self.img_wrongGW
        self.abtn.config(state="disabled")
        self.bbtn.config(state="normal")
        self.cbtn.config(state="normal")
        self.dbtn.config(state="normal")
コード例 #8
0
class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent, name="frame")

        self.parent = parent
        self.initUI()

    def initUI(self):

        self.parent.title("Pi computation")
        self.pack(fill=BOTH, expand=True)

        self.grid_columnconfigure(4, weight=1)
        self.grid_rowconfigure(3, weight=1)

        lbl1 = Label(self, text="Digits:")
        lbl1.grid(row=0, column=0, sticky=E, padx=10, pady=10)

        self.ent1 = Entry(self, width=10)
        self.ent1.insert(END, "4000")
        self.ent1.grid(row=0, column=1, sticky=W)

        lbl2 = Label(self, text="Accuracy:")
        lbl2.grid(row=0, column=2, sticky=E, padx=10, pady=10)

        self.ent2 = Entry(self, width=10)
        self.ent2.insert(END, "100")
        self.ent2.grid(row=0, column=3, sticky=W)

        self.startBtn = Button(self, text="Start",
                               command=self.onStart)
        self.startBtn.grid(row=1, column=0, padx=10, pady=5, sticky=W)

        self.pbar = Progressbar(self, mode='indeterminate')
        self.pbar.grid(row=1, column=1, columnspan=3, sticky=W + E)

        self.txt = scrolledtext.ScrolledText(self)
        self.txt.grid(row=2, column=0, rowspan=4, padx=10, pady=5,
                      columnspan=5, sticky=E + W + S + N)

    def onStart(self):

        self.startBtn.config(state=DISABLED)
        self.txt.delete("1.0", END)

        digits = int(self.ent1.get())
        accuracy = int(self.ent2.get())

        self.p1 = Process(target=generatePi, args=(q, digits, accuracy))
        self.p1.start()
        self.pbar.start(DELAY2)
        self.after(DELAY1, self.onGetValue)

    def onGetValue(self):

        if (self.p1.is_alive()):

            self.after(DELAY1, self.onGetValue)
            return
        else:

            try:

                self.txt.insert('end', q.get(0))
                self.txt.insert('end', "\n")
                self.pbar.stop()
                self.startBtn.config(state=NORMAL)

            except Empty:
                print("queue is empty")
コード例 #9
0
class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('School Lookup')
        self.geometry("300x130")
        self.protocol("WM_DELETE_WINDOW", self.on_exit)
        self.grid_columnconfigure(0, weight=1)

        # self.container = tk.Frame(self)
        choice_label = tk.Label(background='blue',
                                text='Choose the type of school',
                                fg='white',
                                font=('Helvetica', 20)).grid(sticky='ew')

        self.buttons()
        self.percent_str = tk.StringVar(self, "In progress... ")
        self.percent = tk.Label(self,
                                textvariable=self.percent_str,
                                anchor=tk.W).grid(row=2, column=0)

        self.progress = Progressbar(self,
                                    orient=tk.HORIZONTAL,
                                    maximum=100,
                                    mode='indeterminate',
                                    length=150)
        self.progress.grid(row=3, column=0, rowspan=True)
        self.progress.start()
        self.update()
        mp.set_start_method('spawn')

        self.q = mp.Queue()

        self.ca_schools_process = mp.Process(target=self.q.put(
            get_CA_college_schools()),
                                             name="ca_schools_process")

        start = time.time(
        )  # assigns the time we start thread of fetching schools
        self.ca_schools_process.start()

        self.ca_schools_process.join()
        print("Elapsed time: {:.10f}s".format(time.time() - start))
        self.after(1000, self._close_progress_bar())
        self.update()
        self.CA_colleges = self.q.get(0)

    def on_exit(self):
        '''
        This function opens a message box asking if the user wants to quit
        Then quits out of the program if the user clicks yes
        '''
        if tkmb.askyesno("Exit", "Do you want to quit the application?"):
            self.quit()

    def _close_progress_bar(self):
        '''
        This function gets rid of the progress bar in the main
        and puts the state of the buttons back to normal
        '''
        self.progress.stop()
        self.progress.destroy()
        self.percent_str.set("Done ...")
        self.config(cursor="")
        self.by_public_button["state"] = "normal"
        self.by_private_button["state"] = "normal"
        self.by_both_botton["state"] = "normal"

    def buttons(self):
        '''
        This function creates the buttons for the Main Window
        Buttons are intially disabled until the progressbar is
        destroyed
        '''
        buttons_frame = tk.Frame(self)
        buttons_frame.grid_columnconfigure(0, weight=1)
        buttons_frame.grid_rowconfigure(1, weight=1)

        buttons_frame.grid(row=1, column=0, padx=10, pady=10)

        self.by_public_button = tk.Button(buttons_frame,
                                          text='Public',
                                          command=self._public_schools_logic,
                                          state="disabled")
        self.by_public_button.grid(row=0,
                                   column=1,
                                   sticky='ew',
                                   padx=15,
                                   pady=10)

        self.by_private_button = tk.Button(buttons_frame,
                                           text='Private',
                                           command=self._private_schools_logic,
                                           state="disabled")

        self.by_private_button.grid(row=0,
                                    column=2,
                                    sticky='ew',
                                    padx=15,
                                    pady=10)

        self.by_both_botton = tk.Button(
            buttons_frame,
            text="Both",
            command=self._by_both_school_types_logic,
            state="disabled")
        self.by_both_botton.grid(row=0,
                                 column=3,
                                 sticky='ew',
                                 padx=15,
                                 pady=10)

        self.but_about = tk.Button(buttons_frame,
                                   text="About",
                                   command=self._about_info)
        self.but_about.grid(row=0, column=4, sticky='ew', padx=15, pady=10)

    # button1 logic
    def _public_schools_logic(self):
        '''
        function call for public schools button
        '''
        self.by_public_button['state'] = 'disabled'
        self.config(cursor="wait")
        self.update()
        public_schools = [
            (str(i['school.name']) + ", " + str(i['school.city']), i['id'])
            for i in self.CA_colleges if i['school.ownership'] == 1
        ]

        public_schools = sorted(public_schools)
        # print(public_schools)
        # print(len(public_schools))  # 31
        dialogWin = DialogWin(self, *public_schools)
        self.wait_window(dialogWin)
        id_of_schools_list = dialogWin.buttonClick()
        if id_of_schools_list is not None:
            temp_list = self.school_process(id_of_schools_list)
            displayWin = DisplayWin(self, *temp_list)
        self.config(cursor="")
        self.by_public_button['state'] = 'normal'

    # button2 logic
    def _private_schools_logic(self):
        '''
        function call for private schools button
        '''
        self.by_private_button['state'] = 'disabled'

        self.config(cursor="wait")
        self.update()

        private_schools = [
            (str(i['school.name']) + ", " + str(i['school.city']), i['id'])
            for i in self.CA_colleges if i['school.ownership'] == 2
        ]

        private_schools = sorted(private_schools)
        # print(private_schools)
        # print(len(private_schools))  # 22
        dialogWin = DialogWin(self, *private_schools)
        self.wait_window(dialogWin)
        id_of_schools_list = dialogWin.buttonClick()
        if id_of_schools_list is not None:
            temp_list = self.school_process(id_of_schools_list)
            displayWin = DisplayWin(self, *temp_list)
        self.config(cursor="")
        self.by_private_button['state'] = 'normal'

    # button3 logic
    def _by_both_school_types_logic(self):
        '''
        function call for all schools button
        '''

        self.by_both_botton['state'] = 'disabled'
        self.config(cursor="wait")
        self.update()

        all_schools = [(str(i['school.name']) + ", " + str(i['school.city']),
                        i['id']) for i in self.CA_colleges]

        all_schools = sorted(all_schools)
        # print(all_schools)
        # print(len(all_schools))  # 58
        dialogWin = DialogWin(self, *all_schools)
        self.wait_window(dialogWin)
        id_of_schools_list = dialogWin.buttonClick()
        if id_of_schools_list is not None:
            temp_list = self.school_process(id_of_schools_list)
            displayWin = DisplayWin(self, *temp_list)
        self.config(cursor="")
        self.by_both_botton['state'] = 'normal'

    # button4 logic
    def _about_info(self):
        '''
        button to credit the developers
        '''
        credits = "Credits:\nSergio Chairez\nMaksym Sagadin"
        tkmb.showinfo("Credits", credits)

    def school_process(self, id_list):
        '''
         function that will thread the list of schools and add to a queue,
         append to a list and return a list of schools after being threaded
        '''
        self.temp_list = []

        pool = mp.Pool(processes=len(id_list))
        if len(id_list) != 0:
            results = pool.map(get_one_school_info, id_list)

        pool.close()
        pool.join()
        self.temp_list.append(results)
        return results
コード例 #10
0
class InstallWindow:
    def __init__(self, setpath, installpath, systemwide, type='install'):
        global root
        self.setpath = setpath
        self.installpath = installpath
        self.systemwide = systemwide

        self.type = type

        self.master = Toplevel(root)
        self.master.withdraw()
        self.master.protocol('WM_DELETE_WINDOW', self.close)
        self.master.iconbitmap(imgdir)
        self.master.title('Adb & Fastboot installer - By @Pato05')
        self.master.geometry("600x400")
        self.master.resizable(False, False)
        frame = Frame(self.master, relief=FLAT)
        frame.pack(padx=10, pady=5, fill=BOTH)
        Label(frame, text='Please wait while Adb and Fastboot are getting %s...' % (
            'updated' if type == 'update' else 'installed on your PC')).pack(fill=X)
        self.mode = 'unksize'
        self.progressbar = Progressbar(
            frame, orient=HORIZONTAL, length=100, mode='indeterminate')
        self.progressbar.pack(fill=X)
        self.progressbar.start(20)
        self.downloaded = 0
        self.progressv = Text(frame, bd=0, insertborderwidth=0,
                              state='disabled', background='#f0f0ed', font=('Segoe UI', 10))
        self.progressv.pack(fill=BOTH, pady=(10, 5))
        self.master.deiconify()
        self.downloading = threading.Thread(target=self.download)
        self.downloading.start()

    def download_progress(self, count, block_size, total_size):
        if total_size != -1 and self.mode != 'ksize':
            self.mode = 'ksize'
            self.progressbar.stop()
            self.progressbar.configure(mode='determinate', maximum=total_size)
        elif total_size == -1 and self.mode != 'unksize':
            self.mode = 'unksize'
            self.progressbar.configure(mode='indeterminate')
        if self.mode == 'ksize':
            self.downloaded += block_size
            self.progressbar.step(block_size)
            if self.downloaded == total_size:
                self.progress('Download ended.')

    def download(self):
        self.pathres = False
        self.progress('Downloading Adb and Fastboot...', False)
        from urllib.request import urlretrieve
        import urllib.error
        workingdir = scriptdir
        download = os.path.join(workingdir, 'pt.zip')
        try:
            urlretrieve('https://dl.google.com/android/repository/platform-tools-latest-windows.zip',
                        download, self.download_progress)
        except (urllib.error.HTTPError, urllib.error.URLError) as e:
            messagebox.showerror(title='Adb & Fastboot Uninstaller',
                                 message='Failed while trying to download Adb and Fastboot. Are you connected to the internet?\nError: %s' % e)
            self.error_close()
            return False
        self.progressbar.configure(
            mode='indeterminate', maximum=150, length=400, value=0)
        self.progressbar.start(20)
        self.progress('Extracting Adb and Fastboot...')
        from zipfile import ZipFile
        with ZipFile(download) as z:
            z.extractall(workingdir)
        os.remove(download)
        self.progress('Moving Adb and Fastboot to destination folder...')
        if(os.path.isdir(self.installpath)):
            rmtree(self.installpath)
            sleep(0.1)
        os.mkdir(self.installpath)
        for file in ['adb.exe', 'AdbWinApi.dll', 'AdbWinUsbApi.dll', 'fastboot.exe']:
            self.progress("Moving %s..." % file)
            copyfile(os.path.join(workingdir, 'platform-tools', file), os.path.join(self.installpath, file))
        rmtree(os.path.join(workingdir, 'platform-tools'))
        if self.setpath == 1:
            self.progress('Adding Adb & Fastboot into %s\'s path' %
                          ('system' if self.systemwide == 1 else 'user'))
            self.pathres = addToPath(self.installpath, self.systemwide == 1)
            self.progress(
                'Successfully added Adb & Fastboot into path' if self.pathres else 'Failed to add Adb & Fastboot into path')
        self.progressbar.stop()
        self.finish()

    def finish(self):
        self.app = FinishWindow(
            self.setpath, self.pathres, self.installpath, self.type)
        self.master.destroy()

    def progress(self, what, lb=True):
        self.progressv.configure(state='normal')
        self.progressv.insert(END, ('\r\n' if lb else '')+what)
        self.progressv.configure(state='disabled')

    def error_close(self):
        global root
        root.destroy()

    def close(self):
        pass
コード例 #11
0
class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master,
                         borderwidth=5,
                         width=0.8 * screen_width,
                         height=0.7 * screen_height)
        self.master = master
        self.proc = None

        self.main_widgets = []

        script_dir = os.path.dirname(os.path.realpath(__file__))
        sep = os.sep
        self.logoimage = PhotoImage(
            file=f'{script_dir}{sep}GUIgraphics{sep}logo.png')
        self.maskerimage = PhotoImage(
            file=f'{script_dir}{sep}GUIgraphics{sep}masker.png')

        self.run_func = None
        self.run_button = None
        self.progress = None
        self.progress_row = None

        set_style()

        self.grid(row=0, column=0, sticky=N + S + W + E)
        # self.grid_propagate(False)

        self.select_analysis()

        self.chip_para_dict = {}
        self.selex_para_dict = {}
        self.mask_para = []
        self.motif_scan_para = []

        self.selex_gui_dict = {}

        self.master.grid_columnconfigure(0, weight=1)
        self.master.grid_rowconfigure(0, weight=1)

    # clear all widgets in the main panel
    def clear(self):
        # destroy widgets, use pack_forget() or grid_forget() to hide
        for w in self.main_widgets:
            w.destroy()

    def select_analysis(self):
        row_gen = NumGenerator()

        logo = Label(self, image=self.logoimage)
        logo.grid(row=row_gen.get())

        # l1 = Label(self, text="Choose Analysis Type", style="main.TLabel")
        l1 = Label(self, text="", style="main.TLabel")
        l1.grid(row=row_gen.get())

        chip_btn = Button(self,
                          text="Chip-seq",
                          style="main.TButton",
                          command=self.init_chipseq_gui)
        chip_btn.grid(row=row_gen.get(), pady=10)

        selex_btn = Button(self,
                           text="Selex-seq",
                           style="main.TButton",
                           command=self.init_selexseq_gui)
        selex_btn.grid(row=row_gen.get(), pady=10)

        masker_btn = Button(self,
                            text="Masker",
                            style="main.TButton",
                            command=self.init_masker_gui)
        masker_btn.grid(row=row_gen.get(), pady=10)

        l2 = Label(self, text="")
        l2.grid(row=row_gen.get(), padx=40, pady=10)

        quit_btn = Button(self, text="QUIT", command=self.master.destroy)
        quit_btn.grid(row=row_gen.get(), pady=10, ipadx=10, ipady=5)

        # https://stackoverflow.com/questions/45847313/what-does-weight-do-in-tkinter
        self.master.grid_columnconfigure(0, weight=1)
        # self.columnconfigure(1, weight=2)
        # self.columnconfigure(2, weight=1)
        # self.rowconfigure(0, weight=1)
        self.main_widgets += [
            logo, l1, chip_btn, selex_btn, masker_btn, l2, quit_btn
        ]

    def init_masker_gui(self):
        self.clear()
        row_gen = NumGenerator()

        logo = Label(self, image=self.maskerimage)
        # logo.grid_columnconfigure(0, weight=1)
        logo.grid(row=row_gen.get(), columnspan=6)

        irow = row_gen.get()
        infile_label, infile_entry, infile_button = gen_file_entry(
            self, 'Input file', './inputfile.fasta', 'Open File')
        infile_label.grid(row=irow, column=0, columnspan=1, sticky='w')
        infile_entry.grid(row=irow, column=1, columnspan=1, sticky='w')
        infile_button.grid(row=irow, column=2, columnspan=1, sticky='w')

        irow = row_gen.get()
        outfile_label, outfile_entry, outfile_button = gen_file_entry(
            self, 'Output file', './output_file.fasta', 'Open File')
        outfile_label.grid(row=irow, column=0, columnspan=1, sticky='w')
        outfile_entry.grid(row=irow, column=1, columnspan=1, sticky='w')
        outfile_button.grid(row=irow, column=2, columnspan=1, sticky='w')

        irow = row_gen.get()
        text_list = [
            'Repeat/\nMotif', 'Type', 'Include\nRevCom\nPattern', 'Sequence',
            'n_min_repeats/\nn_max_mutation'
        ]
        for i, text in enumerate(text_list):
            tmplabel = Label(self, text=text)
            tmplabel.grid(row=irow, column=i, pady=20, sticky='w')

        def add_pattern(master, label_text, type_value, revcom_value, irow,
                        seq_entry_arr, num_entry_arr):
            if len(seq_entry_arr) >= n_max_pat:
                return
            # label, combobox, checkbox, entry1, entry2
            widget_list = gen_mask_pattern(master, label_text, type_value,
                                           revcom_value)
            for i, w in enumerate(widget_list):
                w.grid(row=irow, column=i, sticky='w')

            revcom_checkbox, seq_entry, num_entry = widget_list[2:]

            revcom_checkbox.invoke()
            # print(f'irow={irow}')
            seq_entry_arr.append(seq_entry)
            num_entry_arr.append(num_entry)

            shift_buttons(irow)

        def shift_buttons(irow):
            self.progress_row += 1
            add_entry_button.grid_forget()
            add_entry_button['command'] = callback_fun_arr[func_ind_gen.get()]
            add_entry_button.grid(row=irow, column=5, sticky='w')
            self.run_button.grid_forget()
            self.run_button.grid(row=irow + 2, column=2, pady=50, sticky='w')
            quit_button.grid_forget()
            quit_button.grid(row=irow + 2, column=4, pady=50, sticky='w')

        def run_analysis():
            self.mask_para = []

            n_input_pat = len(seq_entry_arr)
            masker = Masker()
            for i in range(n_input_pat):
                seq = seq_entry_arr[i].get()
                num = int(num_entry_arr[i].get())
                revcom_flag = revcom_arr[i].get()
                if pat_type_arr[i].get() == 'Repeat':
                    masker.add_reppat(seq, num, revcom_flag)
                else:
                    masker.add_motif(seq, num, revcom_flag)

            infile = infile_entry.get()
            outfile = outfile_entry.get()

            self.mask_para.append(masker)
            self.mask_para.append(infile)
            self.mask_para.append(outfile)

            self.run_mask()

        n_max_pat = 20
        pat_type_arr = [StringVar() for _ in range(n_max_pat)]
        revcom_arr = [BooleanVar() for _ in range(n_max_pat)]
        seq_entry_arr = []
        num_entry_arr = []
        func_ind_gen = NumGenerator()
        callback_fun_arr = [
            Command(add_pattern, self, f'Pattern {i+1}', pat_type_arr[i],
                    revcom_arr[i], irow + i + 1, seq_entry_arr, num_entry_arr)
            for i in range(n_max_pat)
        ]
        # for cmd in callback_fun_arr:
        #     print(cmd.args)
        add_entry_button = Button(self,
                                  text="Add Pattern",
                                  command=callback_fun_arr[func_ind_gen.get()])
        add_entry_button.grid(row=irow, column=5, sticky='w')

        self.progress_row = row_gen.get()
        irow = row_gen.get()
        self.run_button = Button(self, text="RUN", command=run_analysis)
        self.run_button.grid(row=irow, column=2, pady=50, sticky='w')

        quit_button = Button(self, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=irow, column=4, pady=50, sticky='w')

        self.progress = Progressbar(self,
                                    orient=HORIZONTAL,
                                    length=300,
                                    mode='indeterminate')

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)
        self.columnconfigure(3, weight=1)
        self.columnconfigure(4, weight=1)
        self.columnconfigure(5, weight=1)

    def run_mask(self):
        def run_mask_task(*args):
            masker = args[0]
            infile = args[1]
            outfile = args[2]
            self.progress.grid(row=self.progress_row,
                               column=0,
                               columnspan=5,
                               pady=30)
            self.progress.start()
            masker.mask_file(infile, outfile)
            self.progress.stop()
            self.progress.grid_forget()

            messagebox.showinfo('Info', "Process completed!")
            self.run_button['state'] = 'normal'

        self.run_button['state'] = 'disabled'

        threading.Thread(target=run_mask_task, args=self.mask_para).start()

    def init_chipseq_gui(self):
        self.clear()

        logo = Label(self, image=self.logoimage)
        logo.grid(row=0, column=0)

        note = Notebook(self)
        main = Frame(note)
        motif_scan = Frame(note)
        topkmer = Frame(note)
        kmer_query = Frame(note)

        note.add(main, text="Chip-Seq Main")
        note.add(motif_scan, text="Motif Scan")
        note.add(topkmer, text='Top kmer')
        note.add(kmer_query, text='Kmer query')

        self.init_chipseq_gui_tabmain(main)
        self.init_motifscan_guitab(motif_scan)
        self.init_topkmer_guitab(topkmer)
        self.init_kmerquery_guitab(kmer_query)

        note.grid(row=1, column=0)

        self.master.grid_columnconfigure(0, weight=1)
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_rowconfigure(1, weight=5)

    # display top kmer information
    def init_topkmer_guitab(self, master):
        row_gen = NumGenerator()

        irow = row_gen.get()
        infile_label, infile_entry, infile_button = gen_pickel_file_entry(
            master, 'Result File', 'Open file')
        infile_label.grid(row=irow, column=0, sticky='w')
        infile_entry.grid(row=irow, column=1, sticky='w')
        infile_button.grid(row=irow, column=2, sticky='w')

        irow = row_gen.get()
        n_topkmer_label, n_topkmer_entry = gen_label_entry(
            master, 'Number of top kmer', '6')
        n_topkmer_label.grid(row=irow, column=0, sticky='w')
        n_topkmer_entry.grid(row=irow, column=1, sticky='w')

        # create a Text widget
        irow = row_gen.get()
        txt = Text(master, width=32, height=10)
        txt.grid(row=irow,
                 column=0,
                 columnspan=3,
                 sticky="nsew",
                 padx=2,
                 pady=2)

        # create a Scrollbar and associate it with txt
        scrollb = Scrollbar(master, command=txt.yview)
        scrollb.grid(row=irow, column=3, sticky='nsew')
        txt['yscrollcommand'] = scrollb.set

        def run_analysis():
            file = infile_entry.get()
            with open(file, 'rb') as f:
                fp = pickle.load(f)
            kc = fp.kmer_counter
            res = kc.get_top_kmers(int(n_topkmer_entry.get()))
            str_list = kc.disp_kmer_info(kmer_list=res[0])
            txt.delete('1.0', END)
            txt.insert(END, "\n".join(str_list))

        irow = row_gen.get()
        self.run_button = Button(master, text="RUN", command=run_analysis)
        self.run_button.grid(row=irow, column=1, pady=20, sticky='w')

        quit_button = Button(master, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=irow, column=2, pady=20, sticky='w')

        master.columnconfigure(0, weight=5)
        master.columnconfigure(1, weight=10)
        master.columnconfigure(2, weight=5)
        master.columnconfigure(3, weight=1)
        master.rowconfigure(0, weight=1)
        master.rowconfigure(1, weight=1)
        master.rowconfigure(2, weight=7)
        master.rowconfigure(3, weight=1)

    # query kmer information in a list
    def init_kmerquery_guitab(self, master):
        row_gen = NumGenerator()

        irow = row_gen.get()
        infile_label, infile_entry, infile_button = gen_pickel_file_entry(
            master, 'Result File', 'Open file')
        infile_label.grid(row=irow, column=0, sticky='w')
        infile_entry.grid(row=irow, column=1, sticky='w')
        infile_button.grid(row=irow, column=2, sticky='w')

        irow = row_gen.get()
        kmer_info_label = Label(master, text='Input kmer list')
        kmer_info_label.grid(row=irow, column=0, sticky='w')

        irow = row_gen.get()
        kmer_input_txt = Text(master, width=32, height=10)
        kmer_input_txt.grid(row=irow,
                            column=0,
                            columnspan=3,
                            sticky="nsew",
                            padx=2,
                            pady=2)
        kmer_input_txt.insert(END, 'Input kmers here (one kmer per line)')

        # create a Scrollbar and associate it with txt
        kmer_scrollb = Scrollbar(master, command=kmer_input_txt.yview)
        kmer_scrollb.grid(row=irow, column=3, sticky='nsew')
        kmer_input_txt['yscrollcommand'] = kmer_scrollb.set

        irow = row_gen.get()
        output_info_label = Label(master, text='Output')
        output_info_label.grid(row=irow, column=0, sticky='w')

        # create a Text widget
        irow = row_gen.get()
        txt = Text(master, width=32, height=10)
        txt.grid(row=irow,
                 column=0,
                 columnspan=3,
                 sticky="nsew",
                 padx=2,
                 pady=2)

        # create a Scrollbar and associate it with txt
        scrollb = Scrollbar(master, command=txt.yview)
        scrollb.grid(row=irow, column=3, sticky='nsew')
        txt['yscrollcommand'] = scrollb.set

        def run_analysis():
            file = infile_entry.get()
            with open(file, 'rb') as f:
                fp = pickle.load(f)
            kc = fp.kmer_counter

            tmpstr = kmer_input_txt.get("1.0", "end-1c")
            kmer_list = tmpstr.split("\n")
            str_list = []
            for i, kmer in enumerate(kmer_list):
                tmpstr = f'line {i}, '
                if len(kmer) != kc.k:
                    tmpstr += f'{kmer}, kmer length must be {kc.k}. Return!'
                    txt.delete('1.0', END)
                    txt.insert(END, tmpstr)
                    return

            str_list = kc.disp_kmer_info(kmer_list=kmer_list)
            txt.delete('1.0', END)
            txt.insert(END, "\n".join(str_list))

        irow = row_gen.get()
        self.run_button = Button(master, text="RUN", command=run_analysis)
        self.run_button.grid(row=irow, column=1, pady=20, sticky='w')

        quit_button = Button(master, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=irow, column=2, pady=20, sticky='w')

        master.columnconfigure(0, weight=5)
        master.columnconfigure(1, weight=10)
        master.columnconfigure(2, weight=5)
        master.columnconfigure(3, weight=1)
        master.rowconfigure(0, weight=1)
        master.rowconfigure(1, weight=1)
        master.rowconfigure(2, weight=3)
        master.rowconfigure(3, weight=1)
        master.rowconfigure(4, weight=3)
        master.rowconfigure(5, weight=1)

    def run_scan(self):
        def run_scan_task(*args):
            scanner = args[0]
            infile = args[1]
            outfile = args[2]
            self.progress.grid(row=self.progress_row,
                               column=0,
                               columnspan=3,
                               pady=30)
            self.progress.start()
            scanner.scan_file(infile, outfile)
            self.progress.stop()
            self.progress.grid_forget()

            messagebox.showinfo('Info', "Process completed!")
            self.run_button['state'] = 'normal'

        self.run_button['state'] = 'disabled'

        threading.Thread(target=run_scan_task,
                         args=self.motif_scan_para).start()

    def init_motifscan_guitab(self, master):
        row_gen = NumGenerator()

        irow = row_gen.get()
        infile_label, infile_entry, infile_button = gen_file_entry(
            master, 'Input file', './inputfile.fasta', 'Open File')
        infile_label.grid(row=irow, column=0, columnspan=1, sticky='w')
        infile_entry.grid(row=irow, column=1, columnspan=1, sticky='w')
        infile_button.grid(row=irow, column=2, columnspan=1, sticky='w')

        irow = row_gen.get()
        outfile_label, outfile_entry, outfile_button = gen_file_entry(
            master, 'Output file', './output_file.html', 'Open File')
        outfile_label.grid(row=irow, column=0, columnspan=1, sticky='w')
        outfile_entry.grid(row=irow, column=1, columnspan=1, sticky='w')
        outfile_button.grid(row=irow, column=2, columnspan=1, sticky='w')

        irow = row_gen.get()
        text_list = [
            'Motif', 'Include\nRevCom', 'Consensus Sequence', 'n_max_mutation'
        ]
        for i, text in enumerate(text_list):
            tmplabel = Label(master, text=text)
            tmplabel.grid(row=irow, column=i, pady=20, sticky='w')

        def add_pattern(master, label_text, revcom_value, irow, seq_entry_arr,
                        num_entry_arr):
            # allow no more than 2 motifs
            if len(seq_entry_arr) >= 2:
                return
            # label, checkbox, entry1, entry2
            widget_list = gen_motif_row(master, label_text, revcom_value)
            for i, w in enumerate(widget_list):
                w.grid(row=irow, column=i, sticky='w')

            revcom_checkbox, seq_entry, num_entry = widget_list[1:]

            revcom_checkbox.invoke()
            seq_entry_arr.append(seq_entry)
            num_entry_arr.append(num_entry)

            shift_buttons(irow)

        def shift_buttons(irow):
            self.progress_row += 1
            add_entry_button.grid_forget()
            add_entry_button['command'] = callback_fun_arr[func_ind_gen.get()]
            add_entry_button.grid(row=irow, column=4, sticky='w')
            run_button.grid_forget()
            run_button.grid(row=irow + 2, column=2, pady=50, sticky='w')
            quit_button.grid_forget()
            quit_button.grid(row=irow + 2, column=4, pady=50, sticky='w')

        def run_analysis():
            self.motif_scan_para = []

            n_input_pat = len(seq_entry_arr)

            scanner = MotifScanner()
            for i in range(n_input_pat):
                seq = seq_entry_arr[i].get()
                num = int(num_entry_arr[i].get())
                revcom_flag = revcom_arr[i].get()
                scanner.add_motif(seq, num, revcom_flag)

            infile = infile_entry.get()
            outfile = outfile_entry.get()

            self.motif_scan_para.append(scanner)
            self.motif_scan_para.append(infile)
            self.motif_scan_para.append(outfile)

            self.run_scan()

        n_max_pat = 10
        revcom_arr = [BooleanVar() for _ in range(n_max_pat)]
        seq_entry_arr = []
        num_entry_arr = []
        func_ind_gen = NumGenerator()
        callback_fun_arr = [
            Command(add_pattern, master, f'Motif {i+1}', revcom_arr[i],
                    irow + i + 1, seq_entry_arr, num_entry_arr)
            for i in range(n_max_pat)
        ]
        # for cmd in callback_fun_arr:
        #     print(cmd.args)
        add_entry_button = Button(master,
                                  text="Add Motif",
                                  command=callback_fun_arr[func_ind_gen.get()])
        add_entry_button.grid(row=irow, column=4, sticky='w')

        self.progress_row = row_gen.get()
        irow = row_gen.get()
        run_button = Button(master, text="RUN", command=run_analysis)
        run_button.grid(row=irow, column=2, pady=50, sticky='w')

        quit_button = Button(master, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=irow, column=4, pady=50, sticky='w')

        self.progress = Progressbar(master,
                                    orient=HORIZONTAL,
                                    length=300,
                                    mode='indeterminate')

    def init_chipseq_gui_tabmain(self, master):

        # def enter_filename():
        #     file = filedialog.askopenfilename(initialdir='.',title = "Select file", filetypes = (("fasta files",".fasta .fa .gz"),("all files","*.*")))
        #     infile_entry.delete(0,END)
        #     infile_entry.insert(0,file)

        # def enter_outdir():
        #     outdir = filedialog.askdirectory(initialdir='.')
        #     outdir_entry.delete(0,END)
        #     outdir_entry.insert(0,outdir)

        def run_analysis():
            self.chip_para_dict = {
                "identifier": identifier_entry.get(),
                "file_name": infile_entry.get(),
                "out_dir": outdir_entry.get(),
                "min_kmer_len": int(min_kmer_len_entry.get()),
                "max_kmer_len": int(max_kmer_len_entry.get())
            }
            self.run_chipseq()

        # def validate_identifier(in_str):
        #     if in_str:
        #         return True
        #     else:
        #         return False
        # vcmd1 = (master.register(validate_identifier), '%P')

        # def identifiercolour(event):
        #     identifier_entry.config({"background": "light green"})
        #     #identifier_entry.config({"background": "tomoato"})

        # def infilecolour(event):
        #     if os.path.exists(str(infile_entry.get())):
        #         infile_entry.config({"background": "light green"})
        #     else:
        #         infile_entry.config({"background": "tomato"})

        # def outdircolour(event):
        #     if os.access(str(outdir_entry.get()), os.W_OK):
        #         outdir_entry.config({"background": "light green"})
        #     else:
        #         outdir_entry.config({"background": "tomato"})

        # def minkmercolour(event):
        #     if int(min_kmer_len_entry.get()) >= 0:
        #         min_kmer_len_entry.config({"background": "light green"})
        #     else:
        #         min_kmer_len_entry.config({"background": "tomato"})

        # def maxkmercolour(event):
        #     if int(max_kmer_len_entry.get()) >= int(min_kmer_len_entry.get()):
        #         max_kmer_len_entry.config({"background": "light green"})
        #     else:
        #         max_kmer_len_entry.config({"background": "tomato"})

        row_gen = NumGenerator()

        irow = row_gen.get()
        identifier_label, identifier_entry = gen_label_entry(master,
                                                             "Identifier",
                                                             "TF_name",
                                                             grid_on=True,
                                                             irow=irow)
        # identifier_label = Label(master, text="Identifier")
        # identifier_entry = Entry(master, validate="focusout", validatecommand=vcmd1)
        # identifier_entry.insert(END, 'TF_name')
        # identifier_entry['validate']="focusout"
        # identifier_entry['validatecommand']=vcmd1
        # identifier_label.grid(row=irow, column=0)
        # identifier_entry.grid(row=irow, column=1)
        # identifier_entry.bind("<FocusOut>", identifiercolour)

        # def validate_inputfile(in_str):
        #     return os.path.exists(in_str)
        # vcmd2 = (master.register(validate_inputfile), '%P')

        irow = row_gen.get()
        infile_label, infile_entry, infile_button = gen_file_entry(
            master,
            "Input file",
            'path_to_input_fasta_file',
            'Open File',
            grid_on=True,
            irow=irow)

        # infile_label = Label(master, text="Input file")
        # infile_entry = Entry(master)
        # # infile_entry = Entry(master, validate="focusout", validatecommand=vcmd2)
        # infile_entry.insert(END, 'path_to_input_fasta_file')
        # infile_button = Button(master, text="Open File", command=enter_filename)
        # infile_label.grid(row=irow, column=0)
        # infile_entry.grid(row=irow, column=1)
        # infile_button.grid(row=irow, column=2)
        # infile_entry.bind("<FocusOut>", infilecolour)

        # irow = row_gen.get()
        # outdir_label = Label(master, text="Output Directory")
        # outdir_entry = Entry(master)
        # # outdir_entry.insert(END, 'path_to_output_directory')
        # outdir_button = Button(master, text="Open Directory", command=enter_outdir)

        irow = row_gen.get()
        outdir_label, outdir_entry, outdir_button = gen_directory_entry(
            master,
            "Output Directory",
            "",
            "Open Directory",
            grid_on=True,
            irow=irow)
        # outdir_label.grid(row=irow, column=0)
        # outdir_entry.grid(row=irow, column=1)
        # outdir_button.grid(row=irow, column=2)
        # outdir_entry.bind("<FocusOut>", outdircolour)

        # def validate_kmer_len(in_str):
        #     val = int(in_str)
        #     if val<1:
        #         return False
        #     else:
        #         return True
        # vcmd4 = (master.register(validate_kmer_len), '%P')

        irow = row_gen.get()
        min_kmer_len_label, min_kmer_len_entry = gen_label_entry(
            master, "Minimum Kmer Length", "", grid_on=True, irow=irow)
        # min_kmer_len_label = Label(master, text="Minimum Kmer Length")
        # min_kmer_len_entry = Entry(master)
        # min_kmer_len_entry = Entry(master, validate="key", validatecommand=vcmd4)
        # min_kmer_len_label.grid(row=irow, column=0)
        # min_kmer_len_entry.grid(row=irow, column=1)
        # min_kmer_len_entry.bind("<FocusOut>", minkmercolour)

        irow = row_gen.get()
        max_kmer_len_label, max_kmer_len_entry = gen_label_entry(
            master, "Maximum Kmer Length", "", grid_on=True, irow=irow)
        # max_kmer_len_label = Label(master, text="Maximum Kmer Length")
        # max_kmer_len_entry = Entry(master)
        # max_kmer_len_entry = Entry(master,validate="key", validatecommand=vcmd4)
        # max_kmer_len_label.grid(row=irow, column=0)
        # max_kmer_len_entry.grid(row=irow, column=1)
        # max_kmer_len_entry.bind("<FocusOut>", maxkmercolour)

        self.progress_row = row_gen.get()

        irow = row_gen.get()
        self.run_button = Button(master, text="Run", command=run_analysis)
        self.run_button.grid(row=irow, column=1, pady=10)

        quit_button = Button(master, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=irow, column=2, pady=10)

        self.progress = Progressbar(master,
                                    orient=HORIZONTAL,
                                    length=300,
                                    mode='indeterminate')


# see
# https://stackoverflow.com/questions/33768577/tkinter-gui-with-progress-bar
# https://www.youtube.com/watch?v=o_Ct13fHeck

    def run_chipseq(self):
        def chipseq(**kwargs):
            self.progress.grid(row=self.progress_row, column=0, columnspan=3)
            self.progress.start()
            csp = ChipSeqProcessor(**kwargs)
            csp.run()
            self.progress.stop()
            self.progress.grid_forget()

            messagebox.showinfo('Info', "Process completed!")
            self.run_button['state'] = 'normal'

        # print(self.chip_para_dict)

        self.run_button['state'] = 'disabled'

        threading.Thread(target=chipseq, kwargs=self.chip_para_dict).start()

    def init_selexseq_gui(self):
        self.clear()

        row_gen = NumGenerator()

        logo = Label(self, image=self.logoimage)
        logo.grid_columnconfigure(0, weight=1)
        logo.grid(row=row_gen.get())

        note = Notebook(self)
        main = Frame(note)
        motif_scan = Frame(note)
        topkmer = Frame(note)
        kmer_query = Frame(note)

        note.add(main, text="SELEX-SEQ Main")
        note.add(motif_scan, text="Motif Scan")
        note.add(topkmer, text='Top kmer')
        note.add(kmer_query, text='Kmer query')

        self.init_selexseq_gui_tabmain_step0(main)
        self.init_motifscan_guitab(motif_scan)
        self.init_topkmer_guitab(topkmer)
        self.init_kmerquery_guitab(kmer_query)

        note.grid(row=row_gen.get(), column=0)
        # self.columnconfigure(0,weight=1)

        self.master.grid_columnconfigure(0, weight=1)
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_rowconfigure(1, weight=5)

    def init_selexseq_gui_tabmain_step0(self, master):
        # def validate_identifier(in_str):
        #     if in_str:
        #         return True
        #     else:
        #         return False
        # vcmd1 = (master.register(validate_identifier), '%P')

        def call_next():
            self.selex_gui_dict = {
                "identifier_label": identifier_label,
                "identifier_entry": identifier_entry,
                "min_round_label": min_round_label,
                "min_round_entry": min_round_entry,
                "max_round_label": max_round_label,
                "max_round_entry": max_round_entry,
                "next_button": next_button
            }
            self.selex_para_dict = {
                "curr_row": irow,
                "identifier": identifier_entry.get(),
                "min_selex_round": int(min_round_entry.get()),
                "max_selex_round": int(max_round_entry.get())
            }
            self.init_selexseq_gui_tabmain_step1(master)

        # def identifiercolour(event):
        #     identifier_entry.config({"background": "light green"})
        #     #identifier_entry.config({"background": "tomoato"})
        # def minroundcolour(event):
        #     if int(min_round_entry.get()) >= 0:
        #         min_round_entry.config({"background": "light green"})
        #     else:
        #         min_round_entry.config({"background": "tomato"})

        # def maxroundcolour(event):
        #     if int(max_round_entry.get()) >= int(min_round_entry.get()):
        #         max_round_entry.config({"background": "light green"})
        #     else:
        #         max_round_entry.config({"background": "tomato"})

        row_gen = NumGenerator()
        irow = row_gen.get()
        identifier_label, identifier_entry = gen_label_entry(master,
                                                             "Identifier",
                                                             "TF_name",
                                                             grid_on=True,
                                                             irow=irow)

        # identifier_label = Label(master, text="Identifier")
        # identifier_entry = Entry(master, validate="focusout", validatecommand=vcmd1)
        # identifier_entry.insert(END, 'TF_name')
        # identifier_label.grid(row=0, column=0)
        # identifier_entry.grid(row=0, column=1)
        # identifier_entry.bind("<FocusOut>", identifiercolour)

        irow = row_gen.get()
        min_round_label, min_round_entry = gen_label_entry(
            master, "Minimum SELEX round number", "", grid_on=True, irow=irow)

        # irow = 1
        # min_round_label = Label(master, text="Minimum SELEX round number")
        # min_round_entry = Entry(master)
        # # min_round_entry = Entry(master, validate="key", validatecommand=vcmd4)
        # min_round_label.grid(row=irow, column=0)
        # min_round_entry.grid(row=irow, column=1)
        # min_round_entry.bind("<FocusOut>", minroundcolour)

        irow = row_gen.get()
        max_round_label, max_round_entry = gen_label_entry(
            master, "Maximum SELEX round numer", "", grid_on=True, irow=irow)

        # irow = 2
        # max_round_label = Label(master, text="Maximum SELEX round numer")
        # max_round_entry = Entry(master)
        # # max_round_entry = Entry(master, validate="key", validatecommand=vcmd4)
        # max_round_label.grid(row=irow, column=0)
        # max_round_entry.grid(row=irow, column=1)
        # max_round_entry.bind("<FocusOut>", maxroundcolour)

        # irow = 3
        irow = row_gen.get()
        next_button = Button(master, text="Next", command=call_next)
        next_button.grid(row=irow, column=1, pady=10)

    def init_selexseq_gui_tabmain_step1(self, master):
        def call_prev():
            self.selex_para_dict['curr_row'] = curr_row
            for obj in selex_infile_entry_arr + selex_infile_label_arr + selex_infile_button_arr:
                obj.destroy()
            back_button.destroy()
            for key in self.selex_gui_dict:
                self.selex_gui_dict[key].destroy()
            self.init_selexseq_gui_tabmain_step0(master)

        def call_next():
            back_button.destroy()
            self.selex_gui_dict['next_button'].destroy()
            del self.selex_gui_dict['next_button']

            self.selex_para_dict['curr_row'] = curr_row
            self.selex_gui_dict[
                'selex_infile_entry_arr'] = selex_infile_entry_arr

            file_name_arr = []
            for obj in selex_infile_entry_arr:
                file_name_arr.append(obj.get())
            self.selex_para_dict['file_name_arr'] = file_name_arr

            self.init_selexseq_gui_tabmain_step2(master)

        # def enter_filename(i):
        #     file = filedialog.askopenfilename(initialdir='.',title = "Select file", filetypes = (("fasta files",".fasta .fa .gz"),("all files","*.*")))
        #     selex_infile_entry_arr[i].delete(0,END)
        #     selex_infile_entry_arr[i].insert(0,file)

        self.selex_gui_dict['next_button'].grid_forget()

        # def roundfilescolour(event, relround):
        #     if os.path.exists(str(selex_infile_entry_arr[relround].get())):
        #         selex_infile_entry_arr[relround].config({"background": "light green"})
        #     else:
        #         selex_infile_entry_arr[relround].config({"background": "tomato"})

        curr_row = self.selex_para_dict['curr_row']
        selex_infile_label_arr = []
        selex_infile_entry_arr = []
        selex_infile_button_arr = []
        for i_row, i_round in enumerate(
                range(self.selex_para_dict["min_selex_round"],
                      self.selex_para_dict["max_selex_round"] + 1)):
            tmplabel, tmpentry, tmpbutton = gen_file_entry(
                master,
                f'Selex Round {i_round}',
                "",
                "Open File",
                grid_on=True,
                irow=curr_row + i_row)
            # tmplabel = Label(master, text=f'Selex Round {i_round}')
            # tmpentry = Entry(master)
            # #tmpentry.bind("<FocusOut>", lambda event : roundfilescolour(event, i_row))
            # tmpbutton = Button(master, text="Open File", command=Command(enter_filename, i_row) )
            # tmplabel.grid(row=curr_row+i_row, column=0)
            # tmpentry.grid(row=curr_row+i_row, column=1)
            # tmpbutton.grid(row=curr_row+i_row, column=2)
            selex_infile_label_arr.append(tmplabel)
            selex_infile_entry_arr.append(tmpentry)
            # selex_infile_entry_arr[i_row].bind("<FocusOut>", lambda event, relround=(i_row): roundfilescolour(event, relround))
            selex_infile_button_arr.append(tmpbutton)

        curr_row += i_row

        back_button = Button(master, text="Back", command=call_prev)
        back_button.grid(row=curr_row + 1, column=0, pady=10)

        self.selex_gui_dict['next_button']['command'] = call_next
        self.selex_gui_dict['next_button'].grid(row=curr_row + 1,
                                                column=2,
                                                pady=10)

    def init_selexseq_gui_tabmain_step2(self, master):
        def run_analysis():
            self.selex_para_dict["out_dir"] = outdir_entry.get()
            self.selex_para_dict["min_kmer_len"] = int(
                min_kmer_len_entry.get())
            self.selex_para_dict["max_kmer_len"] = int(
                max_kmer_len_entry.get())
            self.run_selexseq()

        # def enter_outdir():
        #     outdir = filedialog.askdirectory(initialdir='.')
        #     outdir_entry.delete(0,END)
        #     outdir_entry.insert(0,outdir)

        curr_row = self.selex_para_dict['curr_row'] + 1

        # def outdircolour(event):
        #     if os.access(str(outdir_entry.get()), os.W_OK):
        #         outdir_entry.config({"background": "light green"})
        #     else:
        #         outdir_entry.config({"background": "tomato"})

        # def minkmercolour(event):
        #     if int(min_kmer_len_entry.get()) >= 0:
        #         min_kmer_len_entry.config({"background": "light green"})
        #     else:
        #         min_kmer_len_entry.config({"background": "tomato"})

        # def maxkmercolour(event):
        #     if int(max_kmer_len_entry.get()) >= int(min_kmer_len_entry.get()):
        #         max_kmer_len_entry.config({"background": "light green"})
        #     else:
        #         max_kmer_len_entry.config({"background": "tomato"})

        # outdir_label = Label(master, text="Output Directory")
        # outdir_entry = Entry(master)
        # outdir_entry.insert(END, 'path_to_output_directory')
        # outdir_button = Button(master, text="Open Directory", command=enter_outdir)
        # outdir_label.grid(row=curr_row, column=0)
        # outdir_entry.grid(row=curr_row, column=1)
        # outdir_button.grid(row=curr_row, column=2)
        # outdir_entry.bind("<FocusOut>", outdircolour)

        row_gen = NumGenerator()
        irow = row_gen.get()
        outdir_label, outdir_entry, outdir_button = gen_directory_entry(
            master,
            "Output Directory",
            'path_to_output_directory',
            "Open Directory",
            grid_on=True,
            irow=curr_row + irow)

        irow = row_gen.get()
        min_kmer_len_label, min_kmer_len_entry = gen_label_entry(
            master,
            "Minimum Kmer Length",
            "",
            grid_on=True,
            irow=curr_row + irow)
        # min_kmer_len_label = Label(master, text="Minimum Kmer Length")
        # min_kmer_len_entry = Entry(master)
        # min_kmer_len_label.grid(row=curr_row+irow, column=0)
        # min_kmer_len_entry.grid(row=curr_row+irow, column=1)
        # min_kmer_len_entry.bind("<FocusOut>", minkmercolour)

        irow = row_gen.get()
        max_kmer_len_label, max_kmer_len_entry = gen_label_entry(
            master,
            "Maximum Kmer Length",
            "",
            grid_on=True,
            irow=curr_row + irow)

        # irow = 2
        # max_kmer_len_label = Label(master, text="Maximum Kmer Length")
        # max_kmer_len_entry = Entry(master)
        # max_kmer_len_label.grid(row=curr_row+irow, column=0)
        # max_kmer_len_entry.grid(row=curr_row+irow, column=1)
        # max_kmer_len_entry.bind("<FocusOut>", maxkmercolour)

        self.progress_row = row_gen.get(
        ) + curr_row  # reserve for progress bar

        # irow = 3
        irow = row_gen.get()
        self.run_button = Button(master, text="Run", command=run_analysis)
        self.run_button.grid(row=curr_row + irow, column=1, pady=10)

        # irow = 3
        quit_button = Button(master, text="QUIT", command=self.master.destroy)
        quit_button.grid(row=curr_row + irow, column=2, pady=10)

        self.progress = Progressbar(master,
                                    orient=HORIZONTAL,
                                    length=300,
                                    mode='indeterminate')

    def run_selexseq(self):
        def selexseq(**kwargs):
            self.progress.grid(row=self.progress_row, column=0, columnspan=3)
            self.progress.start()
            if 'curr_row' in kwargs:
                del kwargs['curr_row']
            ssp = SelexSeqProcessor(**kwargs)
            ssp.run()
            self.progress.stop()
            self.progress.grid_forget()

            messagebox.showinfo('Info', "Process completed!")
            self.run_button['state'] = 'normal'

        self.run_button['state'] = 'disabled'

        threading.Thread(target=selexseq, kwargs=self.selex_para_dict).start()
コード例 #12
0
ファイル: slider_input.py プロジェクト: DHannaway/Python
def simulation():

    root = Tk()

    pb = Progressbar(root,
                     orient="horizontal",
                     length=200,
                     mode="indeterminate")
    pb.pack()
    pb.start()

    B_T = w1.get()
    h_stars = w2.get()
    r_stars = w3.get()
    h_ISM = w4.get()
    r_ISM = w5.get()
    n_0 = w6.get()

    nphotons = 100000

    #Replace the old .param file with a new one with the entered values
    with open('test_dustsimulation_original.param') as g:
        lines = list(g)

    h = open('test_dustsimulation.param', 'w')
    for i in range(0, len(lines)):
        if i == 12:
            h.write('  B_over_T: ' + str(B_T) + '\n')
        elif i == 13:
            h.write('  h_stars: ' + str(h_stars) + ' kpc\n')
        elif i == 14:
            h.write('  r_stars: ' + str(r_stars) + ' kpc\n')
        elif i == 16:
            h.write('  h_ISM: ' + str(h_ISM) + ' kpc\n')
        elif i == 18:
            h.write('  r_ISM: ' + str(r_ISM) + ' kpc\n')
        elif i == 17:
            h.write('  n_0: ' + str(n_0) + ' cm^-3\n')
        elif i == 28:
            h.write('number of photons: ' + str(nphotons) + '\n')
        else:
            h.write(lines[i])
    h.close()

    pb.update_idletasks()
    pb.update()

    #Input this new file into the testDustSimulation program and compile
    os.system(codepath + filename)

    #Input the created binary file, and plot as an image
    image = np.fromfile("test_dustsimulation_output.dat", dtype=np.float64)
    image = image.reshape((200, 200))
    fig, ax = plt.subplots()
    ax.matshow(np.transpose(image), cmap='Greys_r')
    #	ax.matshow(np.transpose(image), cmap=plt.cm.bBu)
    plt.text(5,
             60,
             "B_T =" + str(B_T) + '\n' + "h_stars =" + str(h_stars) + " kpc" +
             '\n' + "r_stars =" + str(r_stars) + " kpc" + '\n' + "h_ISM =" +
             str(h_ISM) + " kpc" + '\n' + "r_ISM =" + str(r_ISM) + " kpc" +
             '\n' + "n0 =" + str(n_0) + " cm^-3",
             color='w')

    tick_locs_x = [0, 100, 200]
    tick_locs_y = [0, 100, 200]

    xtick_lbls = ['-12.1kpc', '0', '12.1kpc']
    ytick_lbls = ['-12.1kpc', '0', '12.1kpc']

    plt.xticks(tick_locs_x, xtick_lbls, rotation=0, fontsize=10)
    plt.yticks(tick_locs_y, ytick_lbls, rotation=0, fontsize=10)

    plt.show()
コード例 #13
0
class MainWindow(Canvas):
    def __init__(self):
        super().__init__()
        self.entries = localFluxs.getListOfEntries()

        #self.window_W = root.winfo_screenwidth() // problem with two screen on xfce
        self.window_W = 1080
        #self.window_Y = root.winfo_screenheight()
        self.window_Y = 720

        self.colors = {}
        self.colors["background"] = "#1a1a1a",
        self.colors["newsTitle"] = "#ffffff"
        self.colors["entrieTitle"] = "#ffffff"
        self.colors["entrieInfos"] = "#808080"
        self.colors["entrieBorder"] = "#00b4c4"
        self.colors["menuBackground"] = "#2e2e2e",
        self.colors["menuActiveBackground"] = "#1a1a1a",
        self.colors["menuForeground"] = "#ffffff",
        self.colors["menuActiveForeground"] = "#00b4c4"
        self.colors["progBarBG"] = "#ffffff"
        self.colors["progBarFG"] = "#00b4c4"

        self.scrollCount = 0
        self.initUI()

    def secondaire(self):
        topEditUrl = Toplevel()
        editurlsUI.MainWindow(topEditUrl)

    def initUI(self):
        self.master.tk.call('wm', 'iconphoto', self.master._w, PhotoImage(file='../res/imgs/icon.png'))
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_columnconfigure(0, weight=1)
        self.master.title('HandFeeder')

        ###### MENU
        menubar = Menu(self.master,
            font = "OpenSans 13 bold",
            background=self.colors["menuBackground"],
            activebackground=self.colors["menuActiveBackground"],
            foreground=self.colors["menuForeground"],
            activeforeground=self.colors["menuActiveForeground"]
        )
        self.master.config(menu=menubar)

        feedsMenu = Menu(menubar,
            font = "OpenSans 13 bold",
            background=self.colors["menuBackground"],
            activebackground=self.colors["menuActiveBackground"],
            foreground=self.colors["menuForeground"],
            activeforeground=self.colors["menuActiveForeground"]
        )
        feedsMenu.add_command(label="Actualize", command=self.actualize)
        feedsMenu.add_command(label="Feeds...", command=self.secondaire)
        menubar.add_cascade(label="Settings", menu=feedsMenu)
        ###### END MENU

        # Canvas qui fait "cadre"
        self.win = Canvas(self.master, 
            width = self.window_W, 
            height = self.window_Y, 
            background = self.colors["background"],
            highlightbackground = self.colors["background"],
            highlightcolor = self.colors["background"]
        )
        self.win.grid(row=0, column=0, sticky='nswe')
        # Scroll
        self.win.bind_all("<MouseWheel>", self.on_mousewheel) # WINDOWS
        self.win.bind_all('<4>', self.on_mousewheel) # LINUX
        self.win.bind_all('<5>', self.on_mousewheel) # LINUX

        # scrollbars
        hScroll = Scrollbar(self.master, orient=HORIZONTAL, command=self.win.xview)
        hScroll.grid(row=1, column=0, sticky='we')

        vScroll = Scrollbar(self.master, orient=VERTICAL, command=self.win.yview)
        vScroll.grid(row=0, column=1, sticky='ns')

        self.win.configure(xscrollcommand=hScroll.set, yscrollcommand=vScroll.set)

        # frame des entrées
        self.entriesFrame = self.updateEntries()

        # création de la window dans le canvas
        self.win.create_window(0, 0, window=self.entriesFrame, anchor=NW)

        # scrollregion sur toute la taille du canvas
        self.win.configure(scrollregion=self.win.bbox(ALL))

        #resize
        self.win.bind('<Configure>', self.resize)

    def resize(self, event):
        w,h = event.width, event.height

        self.win.config(width=w, height=h)
        self.window_W=w
        self.window_Y=h

        self.entriesFrame.destroy()
        self.entriesFrame = self.updateEntries()
        self.win.create_window(0, 0, window=self.entriesFrame, anchor=NW)

        # scrollregion sur toute la taille du canvas
        self.win.configure(scrollregion=self.win.bbox(ALL))        

    def actualize(self):
        # show loading animation
        self.loadingAnimation()
        # start thread for updating
        self.queue = queue.Queue()
        UpdateThread(self.queue).start()
        # check if actualize finished
        self.master.after(100, self.isActualizeFinished)

    def loadingAnimation(self):
        self.entriesFrame.destroy()
        self.entriesFrame = Frame(
            self.win, 
            bg=self.colors["background"]
        )
        Label(self.entriesFrame, bg=self.colors["background"]).pack() # For space
        news_title = Label(self.entriesFrame,
            text = "Loading...",
            font = "OpenSans 25 bold",
            fg=self.colors["newsTitle"],
            bg=self.colors["background"])
        news_title.pack(padx=80)
        Label(self.entriesFrame, bg=self.colors["background"]).pack() # For space

        barStyle = Style()
        barStyle.configure("bar.Horizontal.TProgressbar", 
            troughcolor=self.colors["progBarBG"],
            bordercolor=self.colors["progBarBG"],
            background=self.colors["progBarFG"],
            lightcolor=self.colors["progBarFG"],
            darkcolor=self.colors["progBarFG"]
        )
        self.prog_bar = Progressbar(
            self.entriesFrame, 
            style="bar.Horizontal.TProgressbar",
            orient="horizontal",
            length=200, 
            mode="indeterminate"
        )
        self.prog_bar.pack(padx=80)
        self.prog_bar.start()

        self.entriesFrame.update()
        self.win.create_window(0, 0, window=self.entriesFrame, anchor=NW)
        self.win.configure(scrollregion=self.win.bbox(ALL))
    
    def isActualizeFinished(self):
        try:
            # except if not finished
            msg = self.queue.get(0)

            # print new entries
            self.entriesFrame.destroy()
            self.entries = localFluxs.getListOfEntries()
            self.entriesFrame = self.updateEntries()
            self.win.create_window(0, 0, window=self.entriesFrame, anchor=NW)
            self.win.configure(scrollregion=self.win.bbox(ALL))
        except queue.Empty:
            # check if actualize finished
            self.master.after(100, self.isActualizeFinished)

    def updateEntries(self):
        entriesFrame = Frame(
            self.win, 
            bg=self.colors["background"]
        )

        #newsTitle
        Label(entriesFrame, bg=self.colors["background"]).pack() # For space
        news_title = Label(entriesFrame,
            text = "Latest news",
            font = "OpenSans 25 bold",
            fg=self.colors["newsTitle"],
            bg=self.colors["background"])
        news_title.pack(padx="80")
        Label(entriesFrame, bg=self.colors["background"]).pack() # For space

        # remplissage avec les articles
        for i in range(len(self.entries)):
            #Create entrie obj
            entrie = Entrie(self.entries[i]["domain"], self.entries[i]["title"], self.entries[i]["link"], self.entries[i]["summary"], self.entries[i]["date"], self.entries[i]["enclosure"])

        # Entrie frame
            entrie_frame = Frame(entriesFrame, width=self.window_W-80, height=140)
            entrie_frame.config(
                bg=self.colors["background"]
            )
            entrie_frame.bind("<Button-1>", entrie.click)

            #enclosure
            if entrie.enclosure != "":
                load = Image.open(entrie.enclosurePath)
                #load = load.thumbnail((140, 140), Image.ANTIALIAS)
                load = ImageOps.fit(load, (140, 140), Image.ANTIALIAS)
                render = ImageTk.PhotoImage(load)
                entrie_enclosure = Label(entrie_frame, 
                    image=render
                )
                entrie_enclosure.image = render
                entrie_enclosure.place(x=0, y=0)

            #title
            entrie_title = Label(entrie_frame,
                text=entrie.name,
                font = "OpenSans 18 bold",
                fg=self.colors["entrieTitle"],
                bg=self.colors["background"])
            entrie_title.bind("<Button-1>", entrie.click)
            entrie_title.place(x=160, y=15)

            #source
            entrie_source = Label(entrie_frame,
                text=tools.domainOfUrl(entrie.link),
                font = "OpenSans 15 bold",
                fg=self.colors["entrieInfos"],
                bg=self.colors["background"])
            entrie_source.bind("<Button-1>", entrie.click)
            entrie_source.place(x=160, y=45)

            #date
            entrie_date = Label(entrie_frame,
                text=entrie.dateString,
                font = "OpenSans 13 bold",
                fg=self.colors["entrieInfos"],
                bg=self.colors["background"])
            entrie_date.bind("<Button-1>", entrie.click)
            entrie_date.place(x=160, y=70)

            #summary
            entrie_desc = Label(entrie_frame,
                text=entrie.summary,
                font = "OpenSans 15 bold",
                fg=self.colors["entrieInfos"],
                bg=self.colors["background"])
            entrie_desc.bind("<Button-1>", entrie.click)
            entrie_desc.place(x=160, y=95)

            Label(entriesFrame, bg=self.colors["background"], font = "OpenSans 1 bold").pack() # For space
        # End entrie frame
            entrie_frame.pack(padx=40, pady=20)

        # calcul des dimensions
        entriesFrame.update()
        return entriesFrame

    def on_mousewheel(self, event):
        if event.num == 5 or event.delta == -120:
            self.win.yview_scroll(1, UNITS)
        if event.num == 4 or event.delta == 120:
            self.win.yview_scroll(-1, UNITS)