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()
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)
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.
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)
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()
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")
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")
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")
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
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
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()
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()
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)