def __init__(self, parent, **kwargs): """! A constructor for the class @param self The pointer for the object @param parent The parent object for the frame @param **kwargs Other arguments as accepted by ttk.Scrollbar """ #Initialise the inherited class Progressbar.__init__(self, parent, **kwargs)
def splashscreen(): root = Tk() root.geometry("+200+200") root.overrideredirect(True) root.configure(bg = "white") back = PhotoImage(file = "splashscreen.gif") l1 = Label(root, image = back, bg = "white") scritta = Progressbar(root, orient = "horizontal", mode = "determinate", length = 240) scritta.start(30) copyright = Label(root, text = "Copyright by lokk3d", bg = "white") root.after(3000, root.destroy) l1.pack() scritta.pack(side = "left") copyright.pack( side = "right") root.mainloop()
def __init__(self, master): self.root = master self.searching = False self.can_download = True audiojack.set_useragent('AudioJack', '1.0') self.frame = ScrollableFrame(self.root) self.frame.setconfig(bg='#0D47A1', width=1280, height=720) self.frame.pack(side=TOP, fill=BOTH, expand=1) self.label = Label(self.frame.mainframe, text='AudioJack', fg='#ffffff', bg=self.frame.mainframe['background'], font=('Segoe UI', 48)) self.label.pack() self.url_entry = Entry(self.frame.mainframe, width=48, font=('Segoe UI', 20), bg='#1565C0', bd=2, highlightthickness=1, highlightcolor='#1565C0', highlightbackground='#0D47A1', fg='#ffffff', insertbackground='#ffffff', relief=FLAT, insertwidth=1) self.url_entry.pack() self.submit_button = Button(self.frame.mainframe, width=60, font=('Segoe UI', 16), text='Go!', bd=0, bg='#1E88E5', fg='#ffffff', activebackground='#2196F3', activeforeground='#ffffff', relief=SUNKEN, cursor='hand2', command=self.submit) self.submit_button.pack() self.search_progress = Progressbar(self.frame.mainframe, orient='horizontal', length=720, maximum=100 ,mode='indeterminate') self.error_info = Label(self.frame.mainframe, fg='#ff0000', bg=self.frame.mainframe['background']) # Use pack_forget on this to reset the view self.contents = Frame(self.frame.mainframe, bg=self.frame.mainframe['background']) # Contains results and custom tag options self.select_frame = Frame(self.contents, bg=self.frame.mainframe['background']) self.select_frame.pack() #Search results self.results_label = Label(self.select_frame, text='Results:', fg='#ffffff', bg=self.frame.mainframe['background']) self.results_frame = Frame(self.select_frame, bg=self.frame.mainframe['background']) self.results_label.pack() self.results_frame.pack() # Downloads self.file_label = Label(self.contents, fg='#ffffff', bg=self.frame.mainframe['background'])
def __init__(self, parent, controller): Frame.__init__(self, parent) self.selected = ""; self.controller = controller label = Label(self, text="Select server", font=TITLE_FONT, justify=CENTER, anchor=CENTER) label.pack(side="top", fill="x", pady=10) self.button1 = Button(self, text="Next",state="disabled", command=self.callback_choose) button2 = Button(self, text="Refresh", command=self.callback_refresh) button3 = Button(self, text="Back", command=self.callback_start) scrollbar = Scrollbar(self) self.mylist = Listbox(self, width=100, yscrollcommand = scrollbar.set ) self.mylist.bind("<Double-Button-1>", self.twoClick) self.button1.pack() button2.pack() button3.pack() # create list with a scroolbar scrollbar.pack( side = "right", fill="y" ) self.mylist.pack( side = "top", fill = "x", ipadx=20, ipady=20, padx=20, pady=20 ) scrollbar.config( command = self.mylist.yview ) # create a progress bar label2 = Label(self, text="Refresh progress bar", justify='center', anchor='center') label2.pack(side="top", fill="x") self.bar_lenght = 200 self.pb = Progressbar(self, length=self.bar_lenght, mode='determinate') self.pb.pack(side="top", anchor='center', ipadx=20, ipady=20, padx=10, pady=10) self.pb.config(value=0)
def configureLayout(self): self.top_frame = Frame(self, relief=RAISED, borderwidth=1) self.tip_label_text = StringVar() self.tip_label = Label(self.top_frame, textvariable=self.tip_label_text) self.tip_label_text.set("Install KA Lite") self.kaliteleaf_label = Label(self.top_frame, image=self.kaliteleaf_photo, width=16, height=16) self.kaliteleaf_label.image = self.kaliteleaf_photo self.info_label_text = StringVar() self.info_label_frame = Frame(self) self.info_label = Label(self.info_label_frame, textvariable=self.info_label_text) self.info_label_text.set("Ready to start...") self.progress_bar_frame = Frame(self) self.progress_bar_value = IntVar() self.progress_bar = Progressbar(self.progress_bar_frame, mode="indeterminate", variable=self.progress_bar_value, length=400) self.bottom_space_frame = Frame(self) self.install_button_frame = Frame(self) self.install_button = Button(self.install_button_frame, text="Install", command=self.startInstallation, width=15, height=2) self.quit_button = Button(self.install_button_frame, text="Quit", state=DISABLED, command=quitInstaller, width=15, height=2)
def __body(self): self.BUTTONS={} self.BUTTONS["Update"]=Button(self,text="Update",command=self.updateManga) self.BUTTONS["CheckForUpdates"]=Button(self,text="Check Updates",command=self.updateManga_check) self.BUTTONS["Delete"]=Button(self,text="Delete",command=self.deleteManga) self.BUTTONS["Update"].grid(row=0,column=0,sticky=N+S+E+W) self.BUTTONS["CheckForUpdates"].grid(row=1,column=0,sticky='nsew') self.BUTTONS["Delete"].grid(row=2,column=0,sticky=N+S+E+W) self.LABELS={} self.LABELS["Status"]=Label(self,text="Status:\nUnknown") self.LABELS["ChapterCount"]=Label(self,text="Chapters:\nUnknown") self.LABELS["Updates"]=Label(self,text="Updates:\nUnknown") self.LABELS["Summary"]=LabelResizing(self,text="Summary:\n") self.LABELS["Picture"]=Label(self,image=None) self.LABELS["UpdatingStatus"]=Label(self,text="") self.LABELS["Status"].grid(row=0,column=1) self.LABELS["ChapterCount"].grid(row=1,column=1) self.LABELS["Updates"].grid(row=2,column=1) self.LABELS["Summary"].grid(row=3,column=0,sticky='nwe') self.LABELS["Picture"].grid(row=0,column=2,rowspan=5) self.LABELS["UpdatingStatus"].grid(row=5,column=0,columnspan=3) self.PROGRESSBAR=Progressbar(self) self.PROGRESSBAR.grid(row=6,column=0,columnspan=3,sticky=E+W) self.bindChidrenScrolling() self.grid_columnconfigure(0,weight=1) self.grid_columnconfigure(1,weight=2)
def __init__(self, parent, *args, **kwargs): self.pssm = Pssm(path_to_lookup=AssetWrapper('micall/g2p/g2p_fpr.txt').path, path_to_matrix=AssetWrapper('micall/g2p/g2p.matrix').path) tk.Frame.__init__(self, parent, *args, **kwargs) self.parent = parent parent.report_callback_exception = self.report_callback_exception self.rundir = None # path to MiSeq run folder containing data self.workdir = gettempdir() # default to temp directory os.chdir(self.workdir) self.line_counter = LineCounter() self.run_info = None self.target_files = [] self.button_frame = tk.Frame(self) self.button_frame.pack(side='top') self.console_frame = tk.Frame(self) self.console_frame.pack(side='top', fill='both', expand=True) try: with open(MiCall.CONFIG_FILE, 'rU') as f: self.config = json.load(f) except: self.config = {} self.nthreads = self.config.get('threads', None) if not self.nthreads: self.nthreads = int(round(cpu_count() * 0.5)) self.config['threads'] = self.nthreads self.write_config() self.button_run = tk.Button( self.button_frame, text="Run", command=self.process_files ) self.button_run.grid(row=0, column=1, sticky='W') self.progress_bar = Progressbar(self.button_frame, orient='horizontal', length=500, mode='determinate') self.progress_bar.grid(row=1, columnspan=5) scrollbar = tk.Scrollbar(self.console_frame) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.console = tk.Text(self.console_frame, bg='black', fg='white', yscrollcommand=scrollbar.set) self.console.pack(side=tk.LEFT, fill=tk.BOTH) self.console.tag_configure('ERROR', foreground="red") scrollbar.config(command=self.console.yview) # redirect stderr to Text widget #sys.stderr = Redirector(self.console) self.write('Welcome to MiCall v{}, running with {} threads.\n'.format( pipeline_version, self.nthreads))
def __init__(self, tk_frame, police, **kwargs): LabelFrame.__init__(self, tk_frame, text="Tirage", font=police, **kwargs) self.waiting_time = 10 self.message = Label(self, text="Appuyez sur le bouton pour lancer le tirage", font=police) self.message.grid(column=0, row=0, columnspan=2) self.bouton_quitter = Button(self, text="Quitter", command=self.quit, font=police) self.bouton_quitter.grid(column=0, row=1, pady=10) self.bouton_cliquer = Button(self, text="Lancer!", fg="red", command=self.click, font=police) self.bouton_cliquer.grid(column=1, row=1) self.message_price = Label(self, text="Tirage pour:", font=police) self.price = Label(self, text='', bg="white", width=40, height=1, font=police) self.message_price.grid(column=0, row=3) self.price.grid(column=1, row=3, columnspan=1, padx=10, pady=10) self.message_name = Label(self, text="Le gagnant est:", font=police) self.name = Label(self, text="", bg="white", width=40, height=1, font=police) self.message_name.grid(column=0, row=4) self.name.grid(column=1, row=4, columnspan=1, pady=10) self.parent_name = self.winfo_parent() self.parent = self._nametowidget(self.parent_name) # Part waiting time self.interval = Label(self, text="Intervalle entre tirages (s)", font=police) self.interval.grid(column=0, row=6, columnspan=1, pady=10) self.v = StringVar() self.v.set(self.waiting_time) self.interval_length = Entry(self, textvariable=self.v, width=5, justify=CENTER, font=police) self.interval_length.grid(column=1, row=6, columnspan=1) self.progress_bar = Progressbar(self, length=300) self.progress_bar.grid(column=0, row=8, columnspan=2, pady=10) self.nb_players_text = Label(self, text="Nombre de joueurs", font=police) self.nb_players_text.grid(column=0, row=10, columnspan=1, pady=10) self.nb_players = Label(self, text="0", font=police) self.nb_players.grid(column=1, row=10, columnspan=1, pady=10) self.nb_prices_text = Label(self, text="Nombre de prix restants", font=police) self.nb_prices_text.grid(column=0, row=11, columnspan=1, pady=10) self.nb_prices = Label(self, text="0", font=police) self.nb_prices.grid(column=1, row=11, columnspan=1, pady=10) # police=tkFont.Font(self, size=12)#, family='Courier') # self.config(, font=police) # for i in range(5): # self.grid_rowconfigure(2, weight=1) # self.grid_rowconfigure(5, weight=1) # self.grid_rowconfigure(7, weight=1) # self.grid_rowconfigure(9, weight=1) for i in range(2): self.grid_columnconfigure(i, weight=1)
def sonifyProcessPage(self): Label(self, text="Processing", justify=CENTER, font=root.fontH1).pack(pady=20) self.processing = Label(self, text="", justify=CENTER) self.processing.pack(pady=20) self.pbar = Progressbar(self, orient='horizontal', mode='indeterminate') self.pbar.start(10) self.pbar.pack() self.after(100, self.sonifyProcess)
def __init__(self, master, sproxy): """ Construct new TkSynthWindow master - The Tk container for self. In practice this is an instance of llia.gui.tk.GroupWindow sproxy - An instance of llia.Proxy. """ Frame.__init__(self, master) self.config(background=factory.bg()) self.synth = sproxy self.synth.synth_editor = self self.app = sproxy.app self.sid = sproxy.sid self.group_index = -1 factory.set_pallet(sproxy.specs["pallet"]) main = factory.paned_window(self) main.pack(expand=True, fill="both") self.bank_editor = TkBankEditor(main, self, sproxy) self.bus_and_buffer_editor = None east = factory.frame(main) self.notebook = factory.notebook(east) self.notebook.pack(anchor="nw", expand=True, fill="both") south = factory.frame(east) south.pack(after=self.notebook, anchor="w", expand=True, fill="x") self._lab_status = factory.label(south, "<status>") self._lab_extended = factory.label(south, "") b_panic = factory.panic_button(south, command=self.panic) b_lower = factory.button(south, "-", command=self.lower_window) b_lift = factory.button(south, "+", command=self.lift_window) b_panic.grid(row=0, column=0) self._lab_status.grid(row=0, column=4, sticky='ew') self._lab_extended.grid(row=0,column=5,sticky='e',padx=16) self._lab_extended.config(fg="#f1f1cd") self._progressbar = Progressbar(south,mode="indeterminate") self._progressbar.grid(row=0,column=PROGRESSBAR_COLUMN, sticky='w', padx=8) south.config(background=factory.bg()) main.add(self.bank_editor) main.add(east) self.list_channel = None self.list_keytab = None self.var_transpose = StringVar() self.var_keyrange_low = StringVar() self.var_keyrange_high = StringVar() self.var_bendrange = StringVar() self._init_midi_tab(self.notebook) self._init_map1_tab(self.notebook) # MIDI controllers and pitchwheel self._init_map2_tab(self.notebook) # velocity, aftertouch, keynumber self._init_info_tab(self.notebook) self._child_editors = {} self.update_progressbar(100, 0)
def init_ui(self): MyFrame.init_ui(self) self.columnconfigure(0, weight=2, minsize=150) self.columnconfigure(1, weight=3, minsize=100) self.file_name = TextEntry(self, 'Recorded file name') self.record_time = TextEntry(self, 'Record time') self.progress_bar = Progressbar(self, orient='horizontal', mode='determinate') self.progress_bar.grid(columnspan=2, sticky='NESW') Button(self, text='Record', command=self.threaded_record).grid(columnspan=2, sticky='NESW')
def __init__(self, title, txt): LabelFrame.__init__(self, text=title) # Bar of global progress Label(self, text = 'Global progress').grid(row=1, column = 0) self.proglob = Progressbar(self, orient = HORIZONTAL, max = 50, length = 200, mode = 'determinate') # Bar of attributes progress Label(self, text = 'Attributes progress').grid(row=3, column = 0) self.progatt = Progressbar(self, orient = HORIZONTAL, max = 50, length = 200, mode = 'determinate') # Widgets placement self.proglob.grid(row=2, column = 0, sticky = N+S+W+E, padx = 2, pady = 2) self.progatt.grid(row=4, column = 0, sticky = N+S+W+E, padx = 2, pady = 2)
def _init_status_panel(self): south = self._main.south south.configure(padx=4, pady=4) self._lab_status = factory.label(south, "", modal=False) b_panic = factory.panic_button(south) b_down = factory.button(south, "-") b_up = factory.button(south, "+") b_panic.grid(row=0, column=0) self._progressbar = Progressbar(south,mode="indeterminate") self._progressbar.grid(row=0,column=PROGRESSBAR_COLUMN, sticky='w', padx=8) self._lab_status.grid(row=0,column=4, sticky='w') south.config(background=factory.bg()) b_down.configure(command=lambda: self.root.lower()) b_up.configure(command=lambda: self.root.lift()) self.update_progressbar(100, 0)
def __init__(self, master, _ndpi_file): self.master = master # For WBC-hunt self.hunter = False # Call the super constructor Canvas.__init__(self, master) #self.canvas = Canvas(self, master) # Zoom or roi mode (defaults to roi) self.mode = "roi" # Setup the input file self.ndpi_file = _ndpi_file self.im = None # Actual PhotoImage object of the image self.rgba_im = None # This is needed as a kept reference so that we can resize image on user action self.current_level = None # Scale space level currently used for viewing (for handling zoom etc) self.image_handle = None # Used to delete and recreate images self.setup_image() # Stuff for box selection self.init_box_pos = None # In WINDOW coordinates self.curr_box_bbox = None # Also in current WINDOW coordinates self.last_selection_region = None # This is in level 0 coordinates self.zoom_level = 0 # How many times have we zoomed? self.zoom_region = [] # Stack of regions in level 0 coords that tells us where the zoom is, needed for transforming # Since we want multiple ROIs, save them in this list self.roi_list = [] # Contains Triple: (ROInumber, ROI_imagedata, (bbox, [sub_rois_list])) self.roi_counter = 0 self.progress = Progressbar(self, orient="horizontal", length=100, mode="determinate", value=0) # ProgressBar to show user what is going on. Only one active at a time # Bind some event happenings to appropriate methods self.bind('<Configure>', self.resize_image) self.bind('<B1-Motion>', self.select_box) self.bind('<Button-1>', self.set_init_box_pos) self.bind('<ButtonRelease-1>', self.set_box) self.bind('<Button-3>', self.zoom_out) self.bind('<Left>', self.move_up) # DEBUG self.counter = 0
def __init__(self, parent=None, **kwargs): Frame.__init__(self, parent) self.parent = parent self.job_list_yscroll = Scrollbar(self, orient=Tkinter.VERTICAL) self.job_list_xscroll = Scrollbar(self, orient=Tkinter.HORIZONTAL) self.job_list = Listbox(self, xscrollcommand=self.job_list_xscroll, yscrollcommand=self.job_list_yscroll) self.job_list_xscroll['command'] = self.job_list.xview self.job_list_yscroll['command'] = self.job_list.yview self.new_job_frame = Frame(self) add_icon_filename = kwargs['add_icon_filename'] if 'add_icon_filename' in kwargs else None if add_icon_filename == None: self.add_job_button = Button(self.new_job_frame, text='Add Job', command=self.on_add) else: add_icon = PhotoImage(file=add_icon_filename) self.add_job_button = Button(self.new_job_frame, text='Add Job', compound='bottom', image=add_icon, command=self.on_add) self.remove_job_button = Button(self.new_job_frame, text='Remove Job', command=self.on_remove) self.progress_frame = Frame(self) self.progress_value = Tkinter.IntVar() self.progress_bar = Progressbar(self.progress_frame, variable=self.progress_value) self.button_frame = Frame(self) self.process_button = ProcessButton(parent=self.button_frame, start_jobs=self.start_jobs) self.quit_button = QuitButton(parent=self.button_frame, close_other_windows=self.close_top_level_windows) self.run_job = kwargs['run_job'] if 'run_job' in kwargs else None self.create_plots = kwargs['create_plots'] if 'create_plots' in kwargs else None self.log_filename = kwargs['log_filename'] if 'log_filename' in kwargs else None self.bind('<<AskToClearJobs>>', self.ask_to_clear_jobs) self.bind('<<AskToPlotGraphs>>', self.ask_to_plot_graphs) self.bind('<<CreatePlotGUI>>', self.create_plot_gui) self.parent.bind('<ButtonPress>', self.on_press) self.parent.bind('<Configure>', self.on_resize) self.reinit_variables() self.top_level_windows = list() # NOTE: Because there seems to be an issue resizing child widgets when the top level (Tk) widget is being resized, # the resize option will be disabled for this window self.parent.resizable(width=False, height=False) self.lift()
def __init__(self): root.title("MuBlas") self.lab1 = Label(root, text="Music directory") self.lab1.grid(row = 0, column = 0) self.music_entry = Entry(root,width=50,bd=1) self.music_entry.grid(row = 1, column = 0) self.m_dir_but = Button(root) self.m_dir_but["text"] = "Choose directory" self.m_dir_but.grid(row = 1, column = 1) self.m_dir_but.bind("<Button-1>", self.ask_mus_dir) self.lab3 = Label(root, text="Size in MBytes") self.lab3.grid(row = 2, column = 0) self.size_entry = Entry(root,width=5,bd=1) self.size_entry.grid(row = 2, column = 1) self.lab2 = Label(root, text="Destination directory") self.lab2.grid(row = 3, column = 0) self.destination_entry = Entry(root,width=50,bd=1) self.destination_entry.grid(row = 4, column = 0) self.dest_dir_but = Button(root) self.dest_dir_but["text"] = "Choose directory" self.dest_dir_but.grid(row = 4, column = 1) self.dest_dir_but.bind("<Button-1>", self.ask_out_dir) self.process_but = Button(root) self.process_but["text"] = "Run" self.process_but.grid(row = 6, column = 0) self.process_but.bind("<Button-1>", self.start) self.exit_but = Button(root) self.exit_but["text"] = "Exit" self.exit_but.grid(row = 6, column = 1) self.exit_but.bind("<Button-1>", self.exit_app) self.pr_bar = Progressbar(root, mode='indeterminate') self.pr_bar.grid(row = 5, column = 0, sticky = "we", columnspan = 2)
def __init__(self, master, **options): Progressbar.__init__(self, master, **options) self.queue = Queue.Queue() self.check_queue()
class InterfaceGauche(LabelFrame): """Left frame of the GUI, giving the buttons and the current price and winner""" def __init__(self, tk_frame, police, **kwargs): LabelFrame.__init__(self, tk_frame, text="Tirage", font=police, **kwargs) self.waiting_time = 10 self.message = Label(self, text="Appuyez sur le bouton pour lancer le tirage", font=police) self.message.grid(column=0, row=0, columnspan=2) self.bouton_quitter = Button(self, text="Quitter", command=self.quit, font=police) self.bouton_quitter.grid(column=0, row=1, pady=10) self.bouton_cliquer = Button(self, text="Lancer!", fg="red", command=self.click, font=police) self.bouton_cliquer.grid(column=1, row=1) self.message_price = Label(self, text="Tirage pour:", font=police) self.price = Label(self, text='', bg="white", width=40, height=1, font=police) self.message_price.grid(column=0, row=3) self.price.grid(column=1, row=3, columnspan=1, padx=10, pady=10) self.message_name = Label(self, text="Le gagnant est:", font=police) self.name = Label(self, text="", bg="white", width=40, height=1, font=police) self.message_name.grid(column=0, row=4) self.name.grid(column=1, row=4, columnspan=1, pady=10) self.parent_name = self.winfo_parent() self.parent = self._nametowidget(self.parent_name) # Part waiting time self.interval = Label(self, text="Intervalle entre tirages (s)", font=police) self.interval.grid(column=0, row=6, columnspan=1, pady=10) self.v = StringVar() self.v.set(self.waiting_time) self.interval_length = Entry(self, textvariable=self.v, width=5, justify=CENTER, font=police) self.interval_length.grid(column=1, row=6, columnspan=1) self.progress_bar = Progressbar(self, length=300) self.progress_bar.grid(column=0, row=8, columnspan=2, pady=10) self.nb_players_text = Label(self, text="Nombre de joueurs", font=police) self.nb_players_text.grid(column=0, row=10, columnspan=1, pady=10) self.nb_players = Label(self, text="0", font=police) self.nb_players.grid(column=1, row=10, columnspan=1, pady=10) self.nb_prices_text = Label(self, text="Nombre de prix restants", font=police) self.nb_prices_text.grid(column=0, row=11, columnspan=1, pady=10) self.nb_prices = Label(self, text="0", font=police) self.nb_prices.grid(column=1, row=11, columnspan=1, pady=10) # police=tkFont.Font(self, size=12)#, family='Courier') # self.config(, font=police) # for i in range(5): # self.grid_rowconfigure(2, weight=1) # self.grid_rowconfigure(5, weight=1) # self.grid_rowconfigure(7, weight=1) # self.grid_rowconfigure(9, weight=1) for i in range(2): self.grid_columnconfigure(i, weight=1) def click(self): """When click is selected, the tombola starts""" try: self.waiting_time = int(self.v.get()) except ValueError: showerror("Error", "L'intervalle doit être un nombre") return self.progress_bar['maximum'] = self.waiting_time+0.01 self.interval_length.config(state=DISABLED) self.parent.draw_tombola(self.waiting_time) if not self.parent.list_prices: self.bouton_cliquer.config(state=DISABLED) self.price["text"] = "Tous les lots ont été tirés" self.name["text"] = "" self.update() def update_nb_players(self): self.nb_players["text"] = len(self.parent.list_names) self.nb_players.update() def update_nb_prices(self): self.nb_prices["text"] = len(self.parent.list_prices) self.nb_prices.update()
class FindServer(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.selected = ""; self.controller = controller label = Label(self, text="Select server", font=TITLE_FONT, justify=CENTER, anchor=CENTER) label.pack(side="top", fill="x", pady=10) self.button1 = Button(self, text="Next",state="disabled", command=self.callback_choose) button2 = Button(self, text="Refresh", command=self.callback_refresh) button3 = Button(self, text="Back", command=self.callback_start) scrollbar = Scrollbar(self) self.mylist = Listbox(self, width=100, yscrollcommand = scrollbar.set ) self.mylist.bind("<Double-Button-1>", self.twoClick) self.button1.pack() button2.pack() button3.pack() # create list with a scroolbar scrollbar.pack( side = "right", fill="y" ) self.mylist.pack( side = "top", fill = "x", ipadx=20, ipady=20, padx=20, pady=20 ) scrollbar.config( command = self.mylist.yview ) # create a progress bar label2 = Label(self, text="Refresh progress bar", justify='center', anchor='center') label2.pack(side="top", fill="x") self.bar_lenght = 200 self.pb = Progressbar(self, length=self.bar_lenght, mode='determinate') self.pb.pack(side="top", anchor='center', ipadx=20, ipady=20, padx=10, pady=10) self.pb.config(value=0) # to select he server user must double-click on it def twoClick(self, event): widget = event.widget selection=widget.curselection() value = widget.get(selection[0]) self.selected = value self.button1.config(state="normal") # save the selected server in a global variable SELECTED_SERV = SERVER_LIST[selection[0]] set_globvar(SELECTED_SERV) # listen for broadcasts from port 8192 def listen_broadcasts(self, port, timeout): # Set the progress bar to 0 self.pb.config(value=0) step_size = ((self.bar_lenght/(MAX_NR_OF_SERVERS+1))/2) list_of_servers = [] # Initialize the listener s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.bind(('', port)) s.settimeout(LISTENING_TIMEOUT) # Listen for a number of times to get multiple servers for _ in range(MAX_NR_OF_SERVERS + 1): # Update the progress bar self.pb.step(step_size) self.pb.update_idletasks() try: message, address = s.recvfrom(8192) m_split = message.split(';') if m_split[0] == '\HELLO': server_id = (m_split[1], address) # Check if the server has not yet broadcasted itself. if server_id not in list_of_servers: list_of_servers.append(server_id) except: pass # Close the socket s.close() if not list_of_servers: # If no server found, pop a warning message. tkMessageBox.showwarning("Find Servers", "No servers found. Refresh or create a new game.") # Set the progress bar back to 0 self.pb.config(value=0) # Return the whole list of available servers return list_of_servers # service the refresh button def callback_refresh(self): global SERVER_LIST self.mylist.delete(0,END) SERVER_LIST = self.listen_broadcasts(BROADCASTING_PORT, LISTENING_TIMEOUT) for server_el in SERVER_LIST: self.mylist.insert(END,(" "+str(server_el[0])+" IP: "+str(server_el[1])+" Time: "+str(time.asctime()))) def callback_choose(self): self.mylist.delete(0,END) self.button1.config(state="disabled") self.controller.show_frame("ChooseType") def callback_start(self): self.mylist.delete(0,END) self.button1.config(state="disabled") self.controller.show_frame("StartPage")
class InstallationFrame(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.parent.title("FLE - KA Lite Setup - Start installation") self.loadImages() self.configureLayout() self.drawLayout() def loadImages(self): """Loads the images. The size must be the exact size of the image.""" self.kaliteleaf_photo = PhotoImage(file="images/kaliteleaf.gif", width=16, height=16) def configureLayout(self): self.top_frame = Frame(self, relief=RAISED, borderwidth=1) self.tip_label_text = StringVar() self.tip_label = Label(self.top_frame, textvariable=self.tip_label_text) self.tip_label_text.set("Install KA Lite") self.kaliteleaf_label = Label(self.top_frame, image=self.kaliteleaf_photo, width=16, height=16) self.kaliteleaf_label.image = self.kaliteleaf_photo self.info_label_text = StringVar() self.info_label_frame = Frame(self) self.info_label = Label(self.info_label_frame, textvariable=self.info_label_text) self.info_label_text.set("Ready to start...") self.progress_bar_frame = Frame(self) self.progress_bar_value = IntVar() self.progress_bar = Progressbar(self.progress_bar_frame, mode="indeterminate", variable=self.progress_bar_value, length=400) self.bottom_space_frame = Frame(self) self.install_button_frame = Frame(self) self.install_button = Button(self.install_button_frame, text="Install", command=self.startInstallation, width=15, height=2) self.quit_button = Button(self.install_button_frame, text="Quit", state=DISABLED, command=quitInstaller, width=15, height=2) def drawLayout(self): self.pack(fill=BOTH, expand=True) self.top_frame.pack(fill=X) self.tip_label.pack(fill=X, side=LEFT, padx=5, pady=5) self.kaliteleaf_label.pack(fill=X, side=RIGHT, padx=5, pady=5) self.info_label_frame.pack(fill=X) self.info_label.pack(fill=X, expand=True, padx=10, pady=10) self.progress_bar_frame.pack(fill=X) self.progress_bar.pack(fill=X, expand=True, padx=15, pady=15) self.bottom_space_frame.pack(fill=BOTH, expand=True) self.quit_button.pack(fill=X, side=RIGHT) self.install_button_frame.pack(fill=X, padx=5, pady=5) self.install_button.pack(fill=X, side=RIGHT, padx=5) def startInstallation(self): global TARGET_PATH if not TARGET_PATH: return src = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ka-lite") self.progress_bar.start(10) self.number_of_files = 0 t1 = FuncThread(self.startInstall, src, self.progress_bar, self.number_of_files, self.progress_bar_value, self.tip_label_text, self.info_label_text, self.install_button, self.quit_button) t1.start() def startInstall(self, src, progress_bar, number_of_files, progress_bar_value, tip_label_text, info_label_text, install_button, quit_button): install_button.config(state=DISABLED) tip_label_text.set("Preparing to install KA Lite...") info_label_text.set("Calculating the number of files to copy...") files = [] if os.path.isdir(src): for path, dirs, filenames, in os.walk(src): files.extend(filenames) number_of_files = len(files) progress_bar.stop() progress_bar.config(maximum=number_of_files, mode="determinate", length=400) progress_bar_value.set(0) count = 0 tip_label_text.set("Installing...") info_label_text.set(str(count)+" of "+str(number_of_files)+" copied.") list = [] for path, dirs, filenames in os.walk(src): list.append((path, dirs, filenames)) if not os.path.exists(TARGET_PATH): os.makedirs(TARGET_PATH) for t in list: for directory in t[1]: destDir = t[0].replace(src,TARGET_PATH) if not os.path.exists(os.path.join(destDir, directory)): os.makedirs(os.path.join(destDir, directory)) for sfile in t[2]: srcFile = os.path.join(t[0], sfile) destFile = os.path.join(t[0].replace(src, TARGET_PATH), sfile) shutil.copy(srcFile, destFile) count+=1 info_label_text.set(str(count)+" of "+str(number_of_files)+" copied.") progress_bar_value.set(count) quit_button.config(state=NORMAL) tip_label_text.set("Installation complete.") info_label_text.set("All files were sucessfuly copied.") return
class JobList(Frame): # NOTE: job_params contains information about a Job in the Joblist # NOTE: plot_args contains information about plotting information, which occurs after the jobs have been and the data files have been created def __init__(self, parent=None, **kwargs): Frame.__init__(self, parent) self.parent = parent self.job_list_yscroll = Scrollbar(self, orient=Tkinter.VERTICAL) self.job_list_xscroll = Scrollbar(self, orient=Tkinter.HORIZONTAL) self.job_list = Listbox(self, xscrollcommand=self.job_list_xscroll, yscrollcommand=self.job_list_yscroll) self.job_list_xscroll['command'] = self.job_list.xview self.job_list_yscroll['command'] = self.job_list.yview self.new_job_frame = Frame(self) add_icon_filename = kwargs['add_icon_filename'] if 'add_icon_filename' in kwargs else None if add_icon_filename == None: self.add_job_button = Button(self.new_job_frame, text='Add Job', command=self.on_add) else: add_icon = PhotoImage(file=add_icon_filename) self.add_job_button = Button(self.new_job_frame, text='Add Job', compound='bottom', image=add_icon, command=self.on_add) self.remove_job_button = Button(self.new_job_frame, text='Remove Job', command=self.on_remove) self.progress_frame = Frame(self) self.progress_value = Tkinter.IntVar() self.progress_bar = Progressbar(self.progress_frame, variable=self.progress_value) self.button_frame = Frame(self) self.process_button = ProcessButton(parent=self.button_frame, start_jobs=self.start_jobs) self.quit_button = QuitButton(parent=self.button_frame, close_other_windows=self.close_top_level_windows) self.run_job = kwargs['run_job'] if 'run_job' in kwargs else None self.create_plots = kwargs['create_plots'] if 'create_plots' in kwargs else None self.log_filename = kwargs['log_filename'] if 'log_filename' in kwargs else None self.bind('<<AskToClearJobs>>', self.ask_to_clear_jobs) self.bind('<<AskToPlotGraphs>>', self.ask_to_plot_graphs) self.bind('<<CreatePlotGUI>>', self.create_plot_gui) self.parent.bind('<ButtonPress>', self.on_press) self.parent.bind('<Configure>', self.on_resize) self.reinit_variables() self.top_level_windows = list() # NOTE: Because there seems to be an issue resizing child widgets when the top level (Tk) widget is being resized, # the resize option will be disabled for this window self.parent.resizable(width=False, height=False) self.lift() def reinit_variables(self): self.job_params = dict() self.last_job_id = -1 self.job_outcomes = list() self.plot_args = list() self.on_button = False def add_job_params(self, input_args): self.job_params = input_args # Add each element to the job list for job in self.job_params: self.add_job(job) def add_job(self, job): try: index_end = job['input_directory'].rindex('/') index_start = job['input_directory'].rindex('/', 0, index_end) input_directory_text = job['input_directory'] list_text = 'Job ' + str(job['job_id']) + ' \'' + input_directory_text + '\'' if job['start'] != None: list_text += ' ' + str(job['start']) if job['end'] != None: list_text += ' to' if job['end'] != None: list_text += ' ' + str(job['end']) if job['job_id'] > self.last_job_id: self.last_job_id = job['job_id'] self.job_list.insert(Tkinter.END, list_text) # Add the list text to the job params as an optional parameter to read later to display in a future Graph GUI (or for any other useful purpose) job['list_text'] = list_text # The line number is used wrt the GUI to indicate which job in the job list is being currently executed. job['line_number'] = self.job_list.size() - 1 #print str(job['line_number']) self.job_params[job['job_id']] = job except KeyError as ke: # Should show some error message indicating that there is a problem. pass #print str(self.job_params) #print 'Added Job ' + str(job['job_id']) def ask_to_clear_jobs(self, event): for job in self.job_params.itervalues(): line_number = job['line_number'] self.job_list.itemconfig(line_number, foreground='black') # Update parent to refresh widget appearance self.parent.update() # Reactivate process button self.process_button.config(state = Tkinter.NORMAL) # Note: Display a pop-up that tells the user that the job is done and asks if the job list should be cleared. clearList = msg.askyesno(title='Jobs Finished', message='All jobs have been completed. Would you like to clear the job list?', master=self) if clearList: self.clear_list() def ask_to_plot_graphs(self, event): # TODO: Add a dialog that also asks to create a graph of the 'Other Type Of Plot' plotGraphs = msg.askyesno(title='Plot Graphs', message='Create plots of data?', master=self) if not plotGraphs: return # TODO: Iterate through the jobs to display to the user an interface that asks if they want to graphs of the outputs if self.create_plots != None: output_files_list = list() for job_outcome in self.job_outcomes: for output_outcomes in job_outcome[2]: (station, output_directory, output_files) = output_outcomes for output_files_tuple in output_files: for output_file_tuple in output_files_tuple: (output_file, output_file_success) = output_file_tuple if output_file_success: # If there is a list text variable (the 4th (or 3rd by 0 based index) variable), then add it to our output list if len(job_outcome) == 4: output_files_list.append([output_file, job_outcome[3]]) else: output_files_list.append([output_file]) plots_thread = PlotsThread(self.create_plots, output_files_list, self) plots_thread.start() def add_plot(self, args=dict()): self.plot_args.append(args) def finished_adding_plots(self): self.event_generate('<<CreatePlotGUI>>', when='tail') def create_plot_gui(self, event): # TODO: This should be replaced with a new window that allows the user to drag and drop the icons from one frame to another graph_names = list() for args in self.plot_args: graph_name = args['output_file'] graph_names.append(graph_name) dnd_graphs_frame = Dnd.createFrame(self, 'Drag and Drop Output Plots', graph_names, self.finish_creating_plot_gui) # This is the entry point for the def finish_creating_plot_gui(self, plot_labels): graph_count = 1 for plot_label in plot_labels: for args in self.plot_args: #print 'Looking in ' + args['plot_title'] + ' for ' + plot_label #print 'The plot label is: ' + plot_label #print 'The output file is: ' + args['output_file'] if plot_label == args['output_file']: #print 'Creating graph ' + str(graph_count) graph_count += 1 graph_window = ModelRunnerGraphGUI.GraphWindow(parent=self, title=args['window_title'], df=args['df'], plot=args['plot'], plot_title=args['plot_title'], y_label=args['y_label'], log_filename=self.log_filename) graph_window.set_grid() self.top_level_windows.append(graph_window) #print 'Creating plot GUI # Have to clear out list here instead of clear_list because clear_list() removes plot_args before this method has a chance to read # them and create the appropriate plot graph windows self.reinit_variables() # Clear all the elements in the list def clear_list(self): # Save plot args because they are need later in this run plot_args = self.plot_args self.reinit_variables() # Restore the plot args self.plot_args = plot_args self.job_list.delete(0, self.job_list.size()) self.progress_value.set(0) # Update parent to refresh widget appearance self.parent.update() def on_add(self): single_job = JobParameters(parent=self.parent, beginning_year=1950, ending_year=2100, job_id=self.last_job_id + 1, entry=self) single_job.set_grid() def on_remove(self): selection = self.job_list.curselection() for line_number in selection: line_text = self.job_list.get(line_number) job_id = int(line_text[4:line_text.index(' ', 4)]) job = self.job_params.pop(job_id) self.job_list.delete(line_number) print 'Removed Job ' + str(job['job_id']) # Fix line number for line_number in range(self.job_list.size()): line_text = self.job_list.get(line_number) job_id = int(line_text[4:line_text.index(' ', 4)]) #print 'Job ' + str(job_id) + ' is now on line ' + str(line_number) self.job_params[job_id]['line_number'] = line_number def set_grid(self): self.grid(sticky=Tkinter.N + Tkinter.S + Tkinter.W + Tkinter.E, padx=4, pady=4) self.columnconfigure(0, minsize=600) self.rowconfigure(0, minsize=300) self.job_list.grid(row=0, column=0, sticky=Tkinter.N + Tkinter.S + Tkinter.E + Tkinter.W) self.job_list_yscroll.grid(row=0, column=1, sticky=Tkinter.N + Tkinter.S + Tkinter.W) self.job_list_xscroll.grid(row=1, column=0, sticky=Tkinter.E + Tkinter.W + Tkinter.N) self.new_job_frame.grid(row=2, column=0, pady=3, sticky=Tkinter.W) self.remove_job_button.grid(row=0, column=0) self.add_job_button.grid(row=0, column=1) self.progress_frame.grid(row=3, column=0, pady=3) self.progress_frame.columnconfigure(0, minsize=600) self.progress_bar.grid(row=0, column=0, sticky=Tkinter.E + Tkinter.W + Tkinter.N + Tkinter.S) self.button_frame.grid(row=4, column=0, sticky=Tkinter.E + Tkinter.W + Tkinter.N + Tkinter.S) self.button_frame.columnconfigure(0, minsize=300) self.button_frame.columnconfigure(1, minsize=300) self.process_button.pack(side=Tkinter.RIGHT) self.quit_button.pack(side=Tkinter.RIGHT) def start_jobs(self): # If there are no queued jobs then simply return if len(self.job_params) == 0 or len(self.job_list.get(0)) == 0: return # Deactivate the process button self.process_button.config(state = Tkinter.DISABLED) # Initialize the progress bar self.progress_value.set(0) # Update parent to refresh widget appearance self.parent.update() # Start process thread jobs_thread = JobsThread(self.job_params, self.run_job, self.on_update, self.on_resume) jobs_thread.start() self['cursor'] = 'wait' def on_update(self, status, line_number, step): if status == 'init': self.job_list.itemconfig(line_number, foreground='green') self.job_list.activate(line_number) elif status == 'success': self.job_list.itemconfig(line_number, foreground='blue') elif status == 'fail': self.job_list.itemconfig(line_number, foreground='red') self.progress_value.set(step) # Update parent to refresh widget appearance self.parent.update() def on_resume(self, job_outcomes=list()): self.progress_value.set(100) self.job_outcomes = job_outcomes self.event_generate('<<AskToClearJobs>>', when='tail') self.event_generate('<<AskToPlotGraphs>>', when='tail') self['cursor'] = 'arrow' def close_top_level_windows(self): #print 'Closing other top level windows' for top_level_window in self.top_level_windows: if top_level_window: top_level_window.withdraw() top_level_window.destroy() def notify_of_close(self, top_level_window): if top_level_window in self.top_level_windows: #print 'Removing top level window' self.top_level_windows.remove(top_level_window) def on_press(self, event): self.on_button = True self.release_pattern = "<B%d-ButtonRelease-%d>" % (event.num, event.num) self.parent.bind(self.release_pattern, self.on_release) def on_release(self, event): self.on_button = False def on_resize(self, event): self.parent.lift() if self.on_button: self.set_grid() def on_close(self): self.plot_args = list() self.withdraw() self.destroy()
class MPExportApp(object): """docstring for MPExportApp""" def __init__(self, master): super(MPExportApp, self).__init__() self.master = master self.export_type = StringVar() master.columnconfigure(1, weight=1) export_type_label = Label(master, text="Data Type: ") export_type_label.grid(row=0, column=0, sticky=E) radio_group_frame = Frame(master) radio_group_frame.grid(row=0, column=1, sticky=W) self.events_radio_button = Radiobutton(radio_group_frame, text='Events', value='events', variable=self.export_type, command=self.radio_button_changed) self.events_radio_button.select() self.events_radio_button.grid(row=0, column=0) self.people_radio_button = Radiobutton(radio_group_frame, text='People', value='people', variable=self.export_type, command=self.radio_button_changed) self.people_radio_button.grid(row=0, column=1) api_key_label = Label(master, text="API Key: ") api_key_label.grid(row=1, column=0, sticky=E) self.api_key_entry = Entry(master) self.api_key_entry.grid(row=1, column=1, columnspan=2, sticky=(E,W)) api_secret_label = Label(master, text="API Secret: ") api_secret_label.grid(row=2, column=0, sticky=E) self.api_secret_entry = Entry(master) self.api_secret_entry.grid(row=2, column=1, columnspan=2, sticky=(E, W)) self.project_token_label = Label(master, text="Project Token: ", state=DISABLED) self.project_token_label.grid(row=3, column=0, sticky=E) self.project_token_entry = Entry(master, state=DISABLED) self.project_token_entry.grid(row=3, column=1, columnspan=2, sticky=(E, W)) self.events_label = Label(master, text="Events: ") self.events_label.grid(row=4, column=0, sticky=E) self.events_entry = Entry(master) self.events_entry.insert(0, 'Event A,Event B,Event C') self.events_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.events_entry)) self.events_entry.grid(row=4, column=1, columnspan=2, sticky=(E, W)) where_label = Label(master, text="Where: ") where_label.grid(row=5, column=0, sticky=E) self.where_entry = Entry(master) self.where_entry.grid(row=5, column=1, columnspan=2, sticky=(E, W)) self.from_date_label = Label(master, text="From Date: ") self.from_date_label.grid(row=6, column=0, sticky=E) self.from_date_entry = Entry(master) self.from_date_entry.insert(0, 'YYYY-MM-DD') self.from_date_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.from_date_entry)) self.from_date_entry.grid(row=6, column=1, columnspan=2, sticky=(E, W)) self.to_date_label = Label(master, text="To Date: ") self.to_date_label.grid(row=7, column=0, sticky=E) self.to_date_entry = Entry(master) self.to_date_entry.insert(0, 'YYYY-MM-DD') self.to_date_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.to_date_entry)) self.to_date_entry.grid(row=7, column=1, columnspan=2, sticky=(E, W)) export_button = Button(master, text="EXPORT", fg="green", command=self.export) export_button.grid(row=8, column=1, sticky=(E, W)) self.delete_button = Button(master, text="DELETE", fg='red', state=DISABLED, command=lambda: threading.Thread(target=self.delete_people).start()) self.delete_button.grid(row=9, column=1, sticky=(E, W)) self.progress_bar = Progressbar(master) self.progress_bar_value = IntVar() self.progress_bar.config(mode='determinate', orient='horizontal', variable=self.progress_bar_value) self.progress_bar.grid(row=10, column=0, columnspan=3, sticky=(E, W)) def clear_placeholder_text(self, entry, event): entry_text = entry.get() if entry_text == 'Event A,Event B,Event C' or entry_text == 'YYYY-MM-DD': entry.delete(0, END) def make_events_string(self, events): events = events.replace(', ', ',') events = events.split(',') events_string = '[' for x in range(0, len(events)): events_string += '"' + events[x] + '"' if x != len(events)-1: events_string += ',' else: events_string += ']' return events_string def radio_button_changed(self): if self.export_type.get() == 'people': self.project_token_label.config(state=NORMAL) self.project_token_entry.config(state=NORMAL) self.events_label.config(state=DISABLED) self.events_entry.config(state=DISABLED) self.from_date_label.config(state=DISABLED) self.from_date_entry.config(state=DISABLED) self.to_date_label.config(state=DISABLED) self.to_date_entry.config(state=DISABLED) self.delete_button.config(state=NORMAL) elif self.export_type.get() == 'events': self.project_token_label.config(state=DISABLED) self.project_token_entry.config(state=DISABLED) self.events_label.config(state=NORMAL) self.events_entry.config(state=NORMAL) self.from_date_label.config(state=NORMAL) self.from_date_entry.config(state=NORMAL) self.to_date_label.config(state=NORMAL) self.to_date_entry.config(state=NORMAL) self.delete_button.config(state=DISABLED) def export(self): if self.api_key_entry.get() == '': print 'API Key Required!' return elif self.api_secret_entry.get() == '': print 'API Secret Required!' return self.output_dir = askdirectory(title='Choose output directory', mustexist=True, parent=self.master) if not self.output_dir: return print 'Output directory is ' + self.output_dir self.progress_bar.start() if self.export_type.get() == 'people': self.export_thread = threading.Thread(target=self.export_people) elif self.export_type.get() == 'events': self.export_thread = threading.Thread(target=self.export_events) self.export_thread.start() def export_people(self): mixpanel = Mixpanel( api_key=self.api_key_entry.get(), api_secret=self.api_secret_entry.get(), endpoint=API_ENDPOINT ) '''Here is the place to define your selector to target only the users that you're after''' '''parameters = {'selector':'(properties["$email"] == "Albany") or (properties["$city"] == "Alexandria")'}''' selector = self.where_entry.get() parameters = {} if selector: parameters['selector'] = selector response = mixpanel.request(['engage'], parameters) try: result = '\nAPI ERROR! - ' + json.loads(response)['error'] + '\n' if result: print result self.progress_bar.stop() self.progress_bar_value.set(0) return except KeyError, e: pass parameters['session_id'] = json.loads(response)['session_id'] parameters['page'] = 0 global_total = json.loads(response)['total'] if global_total == 0: print 'Query returned 0 profiles!' self.progress_bar.stop() self.progress_bar_value.set(0) return print "Session id is %s \n" % parameters['session_id'] print "Here are the # of people %d" % global_total filename = self.output_dir + "/people_export_"+str(int(time.time())) jsonfile = filename + ".json" csvfile = filename + ".csv" has_results = True total = 0 with tempfile.NamedTemporaryFile(delete=False) as temp: with open(jsonfile, 'w') as j: j.write('[') while has_results: responser = json.loads(response)['results'] response_count = len(responser) total += response_count has_results = response_count == 1000 i = 0 for data in responser: dump = json.dumps(data) temp.write(dump + '\n') j.write(dump) i += 1 if i != response_count: j.write(',') print "%d / %d" % (total,global_total) parameters['page'] += 1 if has_results: j.write(',') response = mixpanel.request(['engage'], parameters) else: j.write(']') print 'JSON saved to ' + j.name j.close() mixpanel.people_json_to_csv(csvfile, temp.name) temp.close() os.remove(temp.name) self.progress_bar.stop() self.progress_bar_value.set(0)
def __init__(self, master): super(MPExportApp, self).__init__() self.master = master self.export_type = StringVar() master.columnconfigure(1, weight=1) export_type_label = Label(master, text="Data Type: ") export_type_label.grid(row=0, column=0, sticky=E) radio_group_frame = Frame(master) radio_group_frame.grid(row=0, column=1, sticky=W) self.events_radio_button = Radiobutton(radio_group_frame, text='Events', value='events', variable=self.export_type, command=self.radio_button_changed) self.events_radio_button.select() self.events_radio_button.grid(row=0, column=0) self.people_radio_button = Radiobutton(radio_group_frame, text='People', value='people', variable=self.export_type, command=self.radio_button_changed) self.people_radio_button.grid(row=0, column=1) api_key_label = Label(master, text="API Key: ") api_key_label.grid(row=1, column=0, sticky=E) self.api_key_entry = Entry(master) self.api_key_entry.grid(row=1, column=1, columnspan=2, sticky=(E,W)) api_secret_label = Label(master, text="API Secret: ") api_secret_label.grid(row=2, column=0, sticky=E) self.api_secret_entry = Entry(master) self.api_secret_entry.grid(row=2, column=1, columnspan=2, sticky=(E, W)) self.project_token_label = Label(master, text="Project Token: ", state=DISABLED) self.project_token_label.grid(row=3, column=0, sticky=E) self.project_token_entry = Entry(master, state=DISABLED) self.project_token_entry.grid(row=3, column=1, columnspan=2, sticky=(E, W)) self.events_label = Label(master, text="Events: ") self.events_label.grid(row=4, column=0, sticky=E) self.events_entry = Entry(master) self.events_entry.insert(0, 'Event A,Event B,Event C') self.events_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.events_entry)) self.events_entry.grid(row=4, column=1, columnspan=2, sticky=(E, W)) where_label = Label(master, text="Where: ") where_label.grid(row=5, column=0, sticky=E) self.where_entry = Entry(master) self.where_entry.grid(row=5, column=1, columnspan=2, sticky=(E, W)) self.from_date_label = Label(master, text="From Date: ") self.from_date_label.grid(row=6, column=0, sticky=E) self.from_date_entry = Entry(master) self.from_date_entry.insert(0, 'YYYY-MM-DD') self.from_date_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.from_date_entry)) self.from_date_entry.grid(row=6, column=1, columnspan=2, sticky=(E, W)) self.to_date_label = Label(master, text="To Date: ") self.to_date_label.grid(row=7, column=0, sticky=E) self.to_date_entry = Entry(master) self.to_date_entry.insert(0, 'YYYY-MM-DD') self.to_date_entry.bind('<FocusIn>', partial(self.clear_placeholder_text, self.to_date_entry)) self.to_date_entry.grid(row=7, column=1, columnspan=2, sticky=(E, W)) export_button = Button(master, text="EXPORT", fg="green", command=self.export) export_button.grid(row=8, column=1, sticky=(E, W)) self.delete_button = Button(master, text="DELETE", fg='red', state=DISABLED, command=lambda: threading.Thread(target=self.delete_people).start()) self.delete_button.grid(row=9, column=1, sticky=(E, W)) self.progress_bar = Progressbar(master) self.progress_bar_value = IntVar() self.progress_bar.config(mode='determinate', orient='horizontal', variable=self.progress_bar_value) self.progress_bar.grid(row=10, column=0, columnspan=3, sticky=(E, W))
class Window(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("Network/Port Scan") self.style = Style() self.style.configure("TFrame", background = "#000000") self.style.configure("TCheckbutton", background = "#000000") self.style.configure("TButton", background = "#000000") self.pack(fill=BOTH, expand=1) # Configure layout self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=1) self.rowconfigure(5, weight = 1) self.rowconfigure(6, weight = 1) # Title of program lbl = Label(self, text="Network/Port Scan") lbl.grid(sticky = W, pady=5, padx=5) # Text Box area = ScrolledText(self, height = 20) area.grid(row=1, column=0, columnspan=3, rowspan=4, padx=3, sticky = N+S+E+W) self.area = area # IP Address Button self.ip = BooleanVar() ip_add_button = Checkbutton(self, text="IP Address",variable=self.ip, width=10) ip_add_button.grid(row = 1, column = 3, sticky = N) ip_add_button.config(anchor = W, activebackground = "red") # Port Button self.port = BooleanVar() port_button = Checkbutton(self, text="Ports", variable=self.port, width=10) port_button.grid(row = 1, column = 3) port_button.config(anchor = W, activebackground = "orange") # Host Name Button self.host = BooleanVar() host_name_button = Checkbutton(self, text="Host Name",variable=self.host, width=10) host_name_button.grid(row = 1, column = 3, sticky = S) host_name_button.config(anchor = W, activebackground = "yellow") # Gateway Button self.gateway = BooleanVar() gateway_btn = Checkbutton(self, text="Gateway", variable=self.gateway, width=10) gateway_btn.grid(row = 2, column = 3, sticky = N) gateway_btn.config(anchor = W, activebackground = "green") # Services Button self.service = BooleanVar() service_btn = Checkbutton(self, text="Services", variable = self.service, width=10) service_btn.grid(row = 2, column = 3) service_btn.config(anchor = W, activebackground = "blue") # Starting IP label ip_label = Label(self, text = "Starting IP: ") ip_label.grid(row = 5, column = 0, pady = 1, padx = 3, sticky = W) self.ip_from = Entry(self, width = 15) self.ip_from.insert(0, start_ip) self.ip_from.grid(row = 5 , column = 0, pady = 1, padx = 3, sticky = E) # Ending IP label ip_label_two = Label(self, text = "Ending IP: ") ip_label_two.grid(row = 5, column = 1, pady = 1, padx = 5, sticky = W) self.ip_to = Entry(self, width = 15) self.ip_to.insert(0, end_ip) self.ip_to.grid(row = 5 , column = 1, pady = 1, padx = 5, sticky = E) # Starting Port Label port_label = Label(self, text = "Starting Port: ") port_label.grid(row = 5, column = 0, pady = 3, padx = 5, sticky = S+W) self.port_from = Entry(self, width = 15) self.port_from.insert(0, 0) self.port_from.grid(row = 5 , column = 0, pady = 1, padx = 5, sticky = S+E) # Ending Port Label port_label_two = Label(self, text = "Ending Port: ") port_label_two.grid(row = 5, column = 1, pady = 3, padx = 5, sticky = S+W) self.port_to = Entry(self, width = 15) self.port_to.insert(0, 1025) self.port_to.grid(row = 5 , column = 1, pady = 1, padx = 5, sticky = S+E) # Scan Me self_scan_button = Button(self, text="Scan Me", command = lambda : self.onClick(1), width = 33) self_scan_button.grid(row = 6, column = 1, sticky = N) # Scan near me Button scan_other_button = Button(self, text="Scan Near Me", width = 33, command = lambda : self.onClick(2)) scan_other_button.grid(row = 6, column = 0, pady=1, sticky = N) # Clear button clear_button = Button(self, text="Clear text", command = self.clear_text, width = 12) clear_button.grid(row = 6, column = 3, pady=1, sticky = N) # Progress Bar self.label_scanning = Progressbar(self, orient = HORIZONTAL, length = 175) self.label_scanning.grid(row = 6, column = 0, columnspan = 4, padx = 7, pady = 7, sticky = E+S+W) self.label_scanning.config(mode = "determinate") # Clear what is in the text box. def clear_text(self): self.area.delete(0.0, 'end') # empty my lists. my_ports[:] = [] ip_address_up[:] = [] target_host_name[:] = [] target_port_up[:] = [] # On click methods for scan me and scan others. def onClick(self, button_id): if button_id == 1: # Check to see if host button is marked if self.host.get() == 1: message = my_host_name() self.area.insert(0.0, message, ("warning")) self.area.tag_configure("warning", foreground = "blue") # Check to see if ports button is marked if self.port.get() == 1: # Check port entry widgets. if self.port_from: if self.port_to: # Get the user input starting_port = self.port_from.get() ending_port = self.port_to.get() message, total = scan_my_ports(int(starting_port), int(ending_port)) for i in message: new_message = "My TCP " + i + "\n" self.area.insert(0.0, new_message, ("ports")) #self.area.tag_configure("ports", foreground = "green") time = "The TCP port scan completed in: " + str(total) + "\n" self.area.insert(0.0, time, ("timing")) self.area.tag_configure("timing", foreground = "red") else: self.area.insert(0.0, "No valid ports specified.") # Check to see if IP button is marked if self.ip.get() == 1: message = my_ip() self.area.insert(0.0, message) # Check if gateway button is marked. if self.gateway.get() == 1: message = my_gateway() self.area.insert(0.0, message) # Check if service button is marked. if self.service.get() == 1: message, time = scan_my_services() for i in message: new_message = i + "\n" self.area.insert(0.0, new_message) new_time = "The local scan completed in: " + str(time) + "\n" self.area.insert(0.0. new_time, ("timing")) self.area.tag_configure("timing", foreground = "red") # If Scan other button is clicked. elif button_id == 2: # Check other IP's if self.ip.get() == 1: # Check the entry widgets. if self.ip_from: if self.ip_to: # Get the ranges from the entry widgets starting_ipv4_address = self.ip_from.get() ending_ipv4_address = self.ip_to.get() # Pass the values from the entry widgets into the function to scan nearby IP addresses. message, time = ping_ip_other(starting_ipv4_address, ending_ipv4_address) if message: for i in message: new_message = "The address: {:>15} {:>15}".format(i,"is UP\n") self.area.insert(0.0, new_message) total_time = "Range scanned: " + str(starting_ipv4_address) +" to " + str(ending_ipv4_address) + "\n" + "The IP scan completed in: " + str(time) + "\n" self.area.insert(0.0, total_time, ("timing")) self.area.tag_configure("timing", foreground = "red") else: self.area.insert(0.0, "No Ip range is specified.") # Check others Ports if self.port.get() == 1: # Check port entry widgets. if self.port_from: if self.port_to: # Get the user input starting_port = self.port_from.get() ending_port = self.port_to.get() message, time = scan_ports_other(int(starting_port), int(ending_port)) if message: for i in message: new_msg = "The " + i +"\n" self.area.insert(0.0, new_msg) else: new_msg = "Must scan nearby IP addresses first.\n" total_time = "TCP Port scan completed in: " + str(time) + "\n" self.area.insert(0.0, total_time, ("timing")) self.area.tag_configure("timing", foreground = "red") else: self.area.insert(0.0, "No Port range specified.") # Check other host names. Based on IP's scanned. if self.host.get() == 1: message, time = scan_host_other(ip_address_up) # Check that IP's of other computers were collected if message: for i in message: new_message = "Host name: "+ str(i) + "\n" self.area.insert(0.0, new_message) else: new_msg = "Must scan nearby IP addresses first. \n" self.area.insert(0.0, new_msg) total = "The host scan completed in: " + str(time) + "\n" self.area.insert(0.0, total, ("timing")) self.area.tag_configure("timing", foreground = "red") # Check gateway return the gateway of the host machine again. if self.gateway.get() == 1: message = "\n" + str(my_gateway()) self.area.insert(0.0, message) # Check what services are running on which IP and port. if self.service.get() == 1: message, time = services_other() if message: for i in message: new_message = i + "\n" self.area.insert(0.0, new_message) else: new_msg = "The IP addresses and ports must be scanned first." self.area.insert(0.0, new_msg) new_time = "The service scan completed in: " + str(time) + "\n" self.area.insert(0.0, new_time, ("timing")) self.area.tag_configure("timing", foreground = "red") else: pass
def initUI(self): self.parent.title("Network/Port Scan") self.style = Style() self.style.configure("TFrame", background = "#000000") self.style.configure("TCheckbutton", background = "#000000") self.style.configure("TButton", background = "#000000") self.pack(fill=BOTH, expand=1) # Configure layout self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=1) self.rowconfigure(5, weight = 1) self.rowconfigure(6, weight = 1) # Title of program lbl = Label(self, text="Network/Port Scan") lbl.grid(sticky = W, pady=5, padx=5) # Text Box area = ScrolledText(self, height = 20) area.grid(row=1, column=0, columnspan=3, rowspan=4, padx=3, sticky = N+S+E+W) self.area = area # IP Address Button self.ip = BooleanVar() ip_add_button = Checkbutton(self, text="IP Address",variable=self.ip, width=10) ip_add_button.grid(row = 1, column = 3, sticky = N) ip_add_button.config(anchor = W, activebackground = "red") # Port Button self.port = BooleanVar() port_button = Checkbutton(self, text="Ports", variable=self.port, width=10) port_button.grid(row = 1, column = 3) port_button.config(anchor = W, activebackground = "orange") # Host Name Button self.host = BooleanVar() host_name_button = Checkbutton(self, text="Host Name",variable=self.host, width=10) host_name_button.grid(row = 1, column = 3, sticky = S) host_name_button.config(anchor = W, activebackground = "yellow") # Gateway Button self.gateway = BooleanVar() gateway_btn = Checkbutton(self, text="Gateway", variable=self.gateway, width=10) gateway_btn.grid(row = 2, column = 3, sticky = N) gateway_btn.config(anchor = W, activebackground = "green") # Services Button self.service = BooleanVar() service_btn = Checkbutton(self, text="Services", variable = self.service, width=10) service_btn.grid(row = 2, column = 3) service_btn.config(anchor = W, activebackground = "blue") # Starting IP label ip_label = Label(self, text = "Starting IP: ") ip_label.grid(row = 5, column = 0, pady = 1, padx = 3, sticky = W) self.ip_from = Entry(self, width = 15) self.ip_from.insert(0, start_ip) self.ip_from.grid(row = 5 , column = 0, pady = 1, padx = 3, sticky = E) # Ending IP label ip_label_two = Label(self, text = "Ending IP: ") ip_label_two.grid(row = 5, column = 1, pady = 1, padx = 5, sticky = W) self.ip_to = Entry(self, width = 15) self.ip_to.insert(0, end_ip) self.ip_to.grid(row = 5 , column = 1, pady = 1, padx = 5, sticky = E) # Starting Port Label port_label = Label(self, text = "Starting Port: ") port_label.grid(row = 5, column = 0, pady = 3, padx = 5, sticky = S+W) self.port_from = Entry(self, width = 15) self.port_from.insert(0, 0) self.port_from.grid(row = 5 , column = 0, pady = 1, padx = 5, sticky = S+E) # Ending Port Label port_label_two = Label(self, text = "Ending Port: ") port_label_two.grid(row = 5, column = 1, pady = 3, padx = 5, sticky = S+W) self.port_to = Entry(self, width = 15) self.port_to.insert(0, 1025) self.port_to.grid(row = 5 , column = 1, pady = 1, padx = 5, sticky = S+E) # Scan Me self_scan_button = Button(self, text="Scan Me", command = lambda : self.onClick(1), width = 33) self_scan_button.grid(row = 6, column = 1, sticky = N) # Scan near me Button scan_other_button = Button(self, text="Scan Near Me", width = 33, command = lambda : self.onClick(2)) scan_other_button.grid(row = 6, column = 0, pady=1, sticky = N) # Clear button clear_button = Button(self, text="Clear text", command = self.clear_text, width = 12) clear_button.grid(row = 6, column = 3, pady=1, sticky = N) # Progress Bar self.label_scanning = Progressbar(self, orient = HORIZONTAL, length = 175) self.label_scanning.grid(row = 6, column = 0, columnspan = 4, padx = 7, pady = 7, sticky = E+S+W) self.label_scanning.config(mode = "determinate")
class AudioJackGUI(object): def __init__(self, master): self.root = master self.searching = False self.can_download = True audiojack.set_useragent('AudioJack', '1.0') self.frame = ScrollableFrame(self.root) self.frame.setconfig(bg='#0D47A1', width=1280, height=720) self.frame.pack(side=TOP, fill=BOTH, expand=1) self.label = Label(self.frame.mainframe, text='AudioJack', fg='#ffffff', bg=self.frame.mainframe['background'], font=('Segoe UI', 48)) self.label.pack() self.url_entry = Entry(self.frame.mainframe, width=48, font=('Segoe UI', 20), bg='#1565C0', bd=2, highlightthickness=1, highlightcolor='#1565C0', highlightbackground='#0D47A1', fg='#ffffff', insertbackground='#ffffff', relief=FLAT, insertwidth=1) self.url_entry.pack() self.submit_button = Button(self.frame.mainframe, width=60, font=('Segoe UI', 16), text='Go!', bd=0, bg='#1E88E5', fg='#ffffff', activebackground='#2196F3', activeforeground='#ffffff', relief=SUNKEN, cursor='hand2', command=self.submit) self.submit_button.pack() self.search_progress = Progressbar(self.frame.mainframe, orient='horizontal', length=720, maximum=100 ,mode='indeterminate') self.error_info = Label(self.frame.mainframe, fg='#ff0000', bg=self.frame.mainframe['background']) # Use pack_forget on this to reset the view self.contents = Frame(self.frame.mainframe, bg=self.frame.mainframe['background']) # Contains results and custom tag options self.select_frame = Frame(self.contents, bg=self.frame.mainframe['background']) self.select_frame.pack() #Search results self.results_label = Label(self.select_frame, text='Results:', fg='#ffffff', bg=self.frame.mainframe['background']) self.results_frame = Frame(self.select_frame, bg=self.frame.mainframe['background']) self.results_label.pack() self.results_frame.pack() # Downloads self.file_label = Label(self.contents, fg='#ffffff', bg=self.frame.mainframe['background']) def submit(self): self.searching = True self.error_info.pack_forget() self.error_info.config(text='') self.contents.pack_forget() self.reset_results_frame() self.file_label.config(text='') self.results_queue = Queue.Queue() t = Thread(target=self.search) t.daemon = True t.start() self.submit_button.pack_forget() self.search_progress.pack() self.search_progress.start(10) self.root.after(100, self.handle_results) def search(self): url = self.url_entry.get() try: self.results_queue.put(audiojack.get_results(url)) except Exception as e: self.results_queue.put([]) def handle_results(self): try: results = self.results_queue.get(0) self.reset_results_frame() self.search_progress.pack_forget() self.submit_button.pack() if results == []: self.error_info.config(text='No results found.') self.error_info.pack() else: for i, entry in enumerate(results): self.get_result_box(entry).grid(row=i / 4, column=i % 4) self.contents.pack() self.select_frame.pack() except Queue.Empty: self.root.after(100, self.handle_results) def reset_results_frame(self): for result in self.results_frame.winfo_children(): result.destroy() def get_result_box(self, entry): try: text ='%s\n%s\n%s' % (entry['title'], entry['artist'], entry['album']) raw_image = Image.open(BytesIO(entry['img'].decode('base64'))) side = self.frame.mainframe.winfo_reqwidth() / 4 image_data = raw_image.resize((side, side), Image.ANTIALIAS) image = ImageTk.PhotoImage(image=image_data) frame = Frame(self.results_frame) button = Button(frame, fg='#ffffff', text=text, image=image, compound=CENTER, bg=self.frame.mainframe['background'], command=lambda: self.select(entry)) button.image = image button.pack(fill=BOTH, expand=1) return frame except Exception as e: print e print type(e) def select(self, entry): if self.can_download: self.can_download = False self.searching = False self.download_queue = Queue.Queue() t = Thread(target=lambda: self.get_select(entry)) t.daemon = True t.start() self.root.after(100, self.handle_download) def get_select(self, entry): try: self.download_queue.put(audiojack.select(entry)) except Exception: self.download_queue.put('') def handle_download(self): try: file = self.download_queue.get(0) self.can_download = True if not self.searching: label_text = 'Downloaded %s' % file self.select_frame.pack_forget() self.file_label.config(text=label_text) self.file_label.pack() self.contents.pack() except Queue.Empty: self.root.after(100, self.handle_download)
class TkApplicationWindow(AbstractApplicationWindow): def __init__(self, app): self.root = Tk() self.root.title("Llia") self.root.config(background=factory.bg()) super(TkApplicationWindow, self).__init__(app, self.root) self.root.withdraw() if app.config()["enable-splash"]: splash = TkSplashWindow(self.root, app) self.root.deiconify() self.root.protocol("WM_DELETE_WINDOW", self.exit_app) self.llia_graph = None self._main = layout.BorderFrame(self.root) self._main.config(background=factory.bg()) self._main.pack(anchor="nw", expand=True, fill=BOTH) self._progressbar = None self._init_status_panel() self._init_menu() self._init_center_frame(self._main.center) self.root.minsize(width=665, height=375) self.group_windows = [] self.add_synth_group() self._scene_filename = "" def _init_status_panel(self): south = self._main.south south.configure(padx=4, pady=4) self._lab_status = factory.label(south, "", modal=False) b_panic = factory.panic_button(south) b_down = factory.button(south, "-") b_up = factory.button(south, "+") b_panic.grid(row=0, column=0) self._progressbar = Progressbar(south,mode="indeterminate") self._progressbar.grid(row=0,column=PROGRESSBAR_COLUMN, sticky='w', padx=8) self._lab_status.grid(row=0,column=4, sticky='w') south.config(background=factory.bg()) b_down.configure(command=lambda: self.root.lower()) b_up.configure(command=lambda: self.root.lift()) self.update_progressbar(100, 0) def _tab_change_callback(self, event): self.llia_graph.sync() def _init_center_frame(self, master): nb = ttk.Notebook(master) nb.pack(expand=True, fill="both") frame_synths = layout.FlowGrid(nb, 6) frame_efx = layout.FlowGrid(nb, 6) frame_controllers = layout.FlowGrid(nb, 6) self.llia_graph = LliaGraph(nb, self.app) nb.add(frame_synths, text = "Synths") nb.add(frame_efx, text = "Effects") nb.add(frame_controllers, text = "Controllers") nb.add(self.llia_graph, text="Graph") nb.bind("<Button-1>", self._tab_change_callback) def display_info_callback(event): sp = event.widget.synth_spec msg = "%s: %s" % (sp["format"],sp["description"]) self.status(msg) def clear_info_callback(*_): self.status("") for st in con.SYNTH_TYPES: sp = specs[st] ttp = "Add %s Synthesizer (%s)" % (st, sp["description"]) b = factory.logo_button(frame_synths, st, ttip=ttp) b.synth_spec = sp b.bind("<Button-1>", self._show_add_synth_dialog) b.bind("<Enter>", display_info_callback) b.bind("<Leave>", clear_info_callback) frame_synths.add(b) for st in con.EFFECT_TYPES: sp = specs[st] ttp = "Add %s Effect (%s)" % (st, sp["description"]) b = factory.logo_button(frame_efx, st, ttip=ttp) b.synth_spec = sp b.bind("<Button-1>", self._show_add_efx_dialog) b.bind("<Enter>", display_info_callback) b.bind("<Leave>", clear_info_callback) frame_efx.add(b) for st in con.CONTROLLER_SYNTH_TYPES: sp = specs[st] ttp = "Add %s Effect (%s)" % (st, sp["description"]) b = factory.logo_button(frame_controllers, st, ttip=ttp) b.synth_spec = sp b.bind("<Button-1>", self._show_add_controller_dialog) b.bind("<Enter>", display_info_callback) b.bind("<Leave>", clear_info_callback) frame_controllers.add(b) @staticmethod def menu(master): m = Menu(master, tearoff=0) m.config(background=factory.bg(), foreground=factory.fg()) return m def _init_menu(self): main_menu = self.menu(self.root) self.root.config(menu=main_menu) file_menu = self.menu(main_menu) osc_menu = self.menu(main_menu) midi_menu = self.menu(main_menu) bus_menu = self.menu(main_menu) #buffer_menu = self.menu(main_menu) tune_menu = self.menu(main_menu) help_menu = self.menu(main_menu) main_menu.add_cascade(label="File", menu=file_menu) main_menu.add_cascade(label="OSC", menu=osc_menu) main_menu.add_cascade(label="MIDI", menu=midi_menu) #main_menu.add_cascade(label="Buses", menu=bus_menu) #main_menu.add_cascade(label="Buffers", menu=buffer_menu) #main_menu.add_cascade(label="Tune", menu=tune_menu) #main_menu.add_cascade(label="Help", menu=help_menu) self._init_file_menu(file_menu) self._init_osc_menu(osc_menu) self._init_midi_menu(midi_menu) self._init_bus_menu(bus_menu) #self._init_buffer_menu(buffer_menu) self._init_tune_menu(tune_menu) self._init_help_menu(help_menu) def _init_file_menu(self, fmenu): fmenu.add_command(label="Save Scene", command = self.save_scene) fmenu.add_command(label="Load Scene", command = self.load_scene) fmenu.add_separator() fmenu.add_command(label="Lliascript (Legacy)", command = self.show_history_editor) fmenu.add_separator() fmenu.add_command(label="New Synth Group", command = self._add_synth_group) fmenu.add_separator() fmenu.add_command(label="Restart", command = self._interactive_tabula_rasa) fmenu.add_command(label="Quit", command = self.exit_app) def _init_osc_menu(self, iomenu): iomenu.add_command(label="Ping", command = self.ping_global) iomenu.add_command(label="Dump", command = self.app.proxy.dump) iomenu.add_command(label="Toggle OSC Trace", command = self.toggle_osc_trace) def _init_midi_menu(self, mmenu): map_menu = self.menu(mmenu) mmenu.add_command(label = "Channel Names", command = self.show_channel_name_dialog) mmenu.add_command(label = "Controller Names", command = self.show_controller_name_dialog) mmenu.add_cascade(label = "MIDI Maps", menu = map_menu) mmenu.add_command(label = "Toggle MIDI Input Trace", command = self.toggle_midi_input_trace) mmenu.add_command(label = "Toggle MIDI Output Trace", command = self.toggle_midi_output_trace) mmenu.add_command(label = "Toggle Program Pretty Printer", command = self.toggle_program_pretty_printer) def _init_bus_menu(self, bmenu): bmenu.add_command(label="Audio", command=self.show_audiobus_dialog) bmenu.add_command(label="Control", command=self.show_controlbus_dialog) # def _init_buffer_menu(self, bmenu): # bmenu.add_command(label="View Buffers", command=self.show_bufferlist_dialog) def _init_tune_menu(self, tmenu): tmenu.add_command(label = "FIX ME: Nothing to see here") def _init_help_menu(self, hmenu): pass def exit_gui(self): try: self.root.destroy() except: pass def confirm_exit(self): return tkMessageBox.askyesno("Exit Llia", "Exit Llia?") def exit_app(self): self.app.exit_() def as_widget(self): return self.root def status(self, msg): self._lab_status.config(text=str(msg)) def warning(self, msg): msg = "WARNING: %s" % msg self._lab_status.config(text=msg) def clear_status(self): self.status("") def start_gui_loop(self): self.root.mainloop() def show_about_dialog(self): from llia.gui.tk.tk_about_dialog import TkAboutDialog dialog = TkAboutDialog(self.root, self.app) self.root.wait_window(dialog) def display_help(self, topic=None): pass def show_history_editor(self): from llia.gui.tk.tk_history import TkHistoryEditor dialog = TkHistoryEditor(self.root, self.app) self.root.wait_window(dialog) def ping_global(self): try: rs = self.app.proxy.ping() if rs: self.status("Ping OK") else: self.warning("Ping Error") except LliaPingError as err: self.warning(err.message) def toggle_osc_trace(self): LliaProxy.trace = not LliaProxy.trace if LliaProxy.trace: self.status("OSC transmission trace enabled") else: self.status("OSC transmission trace disabled") def show_channel_name_dialog(self): from llia.gui.tk.tk_channel_name_editor import TkChannelNameEditor dialog = TkChannelNameEditor(self.root, self.app) self.root.wait_window(dialog) def show_controller_name_dialog(self): from llia.gui.tk.tk_controller_name_editor import TkControllerNameEditor dialog = TkControllerNameEditor(self.root, self.app) self.root.wait_window(dialog) def toggle_midi_input_trace(self): flag = not self.app.midi_in_trace self.app.midi_in_trace = flag self.app.midi_receiver.enable_trace(flag) if flag: self.status("MIDI input trace enabled") else: self.status("MIDI output trace disabled") def toggle_midi_output_trace(self): self.status("MIDI output not available") # FIX ME def toggle_program_pretty_printer(self): self.app.pp_enabled = not self.app.pp_enabled if self.app.pp_enabled: self.status("Pretty printer enabled") else: self.status("Pretty printer disabled") def show_audiobus_dialog(self): from llia.gui.tk.tk_audiobus_editor import TkAudiobusEditor dialog = TkAudiobusEditor(self.root, self.app) self.root.wait_window(dialog) def show_controlbus_dialog(self): from llia.gui.tk.tk_controlbus_editor import TkControlbusEditor dialog = TkControlbusEditor(self.root, self.app) self.root.wait_window(dialog) # def show_bufferlist_dialog(self): # from llia.gui.tk.tk_buffer_info import TkBufferListDialog # dialog = TkBufferListDialog(self.root, self.app) # self.root.wait_window(dialog) def _show_add_synth_dialog(self, event): w = event.widget st = w.config()["text"][-1] dialog = TkAddSynthDialog(self.root, self.app, st, False) self.root.wait_window(dialog) def _show_add_efx_dialog(self, event): w = event.widget st = w.config()["text"][-1] dialog = TkAddSynthDialog(self.root, self.app, st, is_efx=True, is_controller=False) self.root.wait_window(dialog) def _show_add_controller_dialog(self, event): w = event.widget st = w.config()["text"][-1] dialog = TkAddSynthDialog(self.root, self.app, st, is_efx=False, is_controller=True) self.root.wait_window(dialog) def _add_synth_group(self): sh = self.app.ls_parser.synthhelper sh.new_group() def add_synth_group(self, name=None): gw = GroupWindow(self.app, self.root, name) # gw.transient(self.root) # If executed keeps main app window behind all other windows. self.group_windows.append(gw) self.status("Added new Synth Group Window") return gw def display_synth_editor(self, sid): try: swin = self[sid] grpid = swin.group_index grp = self.group_windows[grpid] #grp.deiconify() grp.show_synth_editor(sid) except (KeyError, IndexError): msg = "Can not find editor for %s" % sid self.warning(msg) def update_progressbar(self, count, value): self._progressbar.config(mode="determinate", maximum=count) self._progressbar.step() self.root.update_idletasks() def busy(self, flag, message=""): if message: self.status(message) self._progressbar.config(mode="indeterminate") if flag: self._progressbar.grid(row=0, column=PROGRESSBAR_COLUMN, sticky='w', padx=8) self._progressbar.start() else: self._progressbar.stop() # self._progressbar.grid_remove() self.root.update_idletasks() def save_scene(self, *_): options = {'defaultextension' : '.llia', 'filetypes' : [('Llia Scenes', '*.llia'), ('all files', '*')], 'initialfile' : self._scene_filename, 'parent' : self.root, 'title' : "Save Llia Scene"} filename = tkFileDialog.asksaveasfilename(**options) if filename: try: self.app.ls_parser.save_scene(filename) self._scene_filename = filename self.status("Scene saved as '%s'" % filename) except Exception as ex: self.warning(ex.message) else: self.status("Scene save canceld") def load_scene(self, *_): options = {'defaultextension' : '.llia', 'filetypes' : [('Llia Scenes', '*.llia'), ('all files', '*')], 'initialfile' : self._scene_filename, 'parent' : self.root, 'title' : "Load Llia Scene"} filename = tkFileDialog.askopenfilename(**options) if filename: try: self.app.ls_parser.load_scene(filename) self.status("Scene '%s' loaded" % filename) self._scene_filename = filename except Exception as ex: self.warning(ex.message) else: self.status("Load scene canceld") def tabula_rasa(self): for grp in self.group_windows: grp.tabula_rasa() self.group_windows = [] def _interactive_tabula_rasa(self, *_): # ISSUE: Check config and ask user confirmation before existing self.app.ls_parser.tabula_rasa()
class FdaAltimeterControl(tk.Toplevel): PORT_SELECTION_FRAME_HEIGHT = 80 SUB_FRAME_X_PADDING = 20 def __init__(self, parent): tk.Toplevel.__init__(self) self.parent = parent # Do not let user to close this window # is a communication with the Altimeter # is taking place. self.communicating = False self.protocol("WM_DELETE_WINDOW", self.close_asked) # Setup window content. self.initialize() def initialize(self): self.title(_(u'FlyDream Altimeter - Device Controller')) # Set fixed size. self.minsize(640, 320) self.resizable(False, False) # Altimeter local device. frame = tk.Frame(self, height=self.PORT_SELECTION_FRAME_HEIGHT) frame.pack(fill=tk.BOTH, expand=tk.YES) tk.Label(frame, text=_(u'Altimeter plugged on:')).pack(side=tk.LEFT) self.detect = tk.Button(frame, text=_(u'Refresh'), command=self.refresh_serial_ports) self.detect.pack(side=tk.RIGHT) self.port = tk.StringVar(self) self.ports = tk.OptionMenu(frame, self.port, _(u'Detecting serial ports...')) self.ports.pack(fill=tk.X, expand=tk.YES) # Update possible serial ports. self.refresh_serial_ports() # Upload altimeter flight data. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Upload')) label.pack(side=tk.TOP, fill=tk.X) # Setup bold font for titles. f = Font(font=label['font']) f['weight'] = 'bold' label['font'] = f.name Separator(frame).pack(fill=tk.X) self.progressbar = Progressbar(frame, orient='horizontal', mode='determinate') self.progressbar.pack(side=tk.BOTTOM, fill=tk.X) # Do not show progressbar # unless data is uploaded. self.hide_progressbar() self.upload_info = tk.StringVar() self.upload_info.set('/') self.info_label = tk.Label(frame, anchor=tk.NE, fg='darkgrey', textvariable=self.upload_info) self.info_label.pack(side=tk.BOTTOM, fill=tk.BOTH) self.label = tk.Label(frame, anchor=tk.W, text=_(u'Tell the altimeter to send flight ' 'data to your computer')) self.label.pack(side=tk.LEFT) self.upload = tk.Button(frame, text=_(u'Upload data'), command=self.upload) self.upload.pack(side=tk.RIGHT) # Erase altimeter flight data. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Clear')) label['font'] = f.name label.pack(side=tk.TOP, fill=tk.X) Separator(frame).pack(fill=tk.X) label = tk.Label(frame, anchor=tk.W, text=_(u'Delete all the flight data from your altimeter')) label.pack(side=tk.LEFT) self.erase = tk.Button(frame, text=_(u'Erase data'), command=self.erase) self.erase.pack(side=tk.RIGHT) # Setup altimeter sampling frequency. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Configure')) label['font'] = f.name label.pack(side=tk.TOP, fill=tk.X) Separator(frame).pack(fill=tk.X) self.frequency = tk.StringVar(self) self.frequency.set('1') self.frequencies = tk.OptionMenu(frame, self.frequency, '1', '2', '4', '8') self.frequencies.pack(side=tk.LEFT) label = tk.Label(frame, text=_(u'records per second')) label.pack(side=tk.LEFT) self.setup = tk.Button(frame, text=_(u'Set sampling frequency'), command=self.set_frequency) self.setup.pack(side=tk.RIGHT) def allow_user_interactions(self, allow=True): state = tk.NORMAL if allow else tk.DISABLED self.ports.configure(state=state) self.detect.configure(state=state) self.upload.configure(state=state) self.erase.configure(state=state) self.frequencies.configure(state=state) self.setup.configure(state=state) def close_asked(self): if not self.communicating: self.destroy() return else: showwarning(_(u'Warning'), _(u"""The application is communicating with the altimeter. Please wait until communication is finished before closing this window.""")) def hide_progressbar(self): self.progressbar.prev_pack = self.progressbar.pack_info() self.progressbar.pack_forget() self.update() # Reset progressbar for next upload. self.progressbar['value'] = 0 def show_progressbar(self): # Well, Tkinter pack does not seem to # make it easy to simply hide a widget... # # I may be missing something. prev_info_label_packinfo = self.info_label.pack_info() prev_label_packinfo = self.label.pack_info() prev_upload_packinfo = self.upload.pack_info() self.info_label.pack_forget() self.label.pack_forget() self.upload.pack_forget() self.progressbar.pack(self.progressbar.prev_pack) self.info_label.pack(prev_info_label_packinfo) self.label.pack(prev_label_packinfo) self.upload.pack(prev_upload_packinfo) self.update() def upload_progressed(self, read, total): self.progressbar['maximum'] = total self.progressbar['value'] = read info = _(u'Please wait, %d bytes read out of %d') % (read, total) self.upload_info.set(info) self.update() def default_filename(self): return time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()) \ + '_flight' def upload(self): # TODO Add please wait message. # Update window state. self.show_progressbar() self.allow_user_interactions(False) self.communicating = True # Get flight data. port = self.port.get() altimeter = Altimeter(port) try: raw_data = altimeter.upload(self.upload_progressed) except FlyDreamAltimeterSerialPortError: self.show_unfound_altimeter(port) except (FlyDreamAltimeterReadError, FlyDreamAltimeterWriteError) as e: self.show_readwrite_error(port, e.message) except FlyDreamAltimeterProtocolError as e: self.show_protocol_error(port, e.message) else: # Check received data. if len(raw_data.data) == 0: showinfo(_(u'Upload Data'), _(u'Altimeter contains no data.')) else: filename = self.write_flight_data(raw_data) self.suggest_open_in_viewer(filename) finally: # Restore window state. self.communicating = False self.allow_user_interactions() self.hide_progressbar() # TODO Update altimeter information. self.upload_info.set(_(u'Done')) def write_flight_data(self, raw_data): # Let user choose a file name. # # When cancelled, None is returned. fname = asksaveasfilename( filetypes=((_(u'Flydream Altimeter Data'), '*.fda'), (_(u'All files'), '*.*')), title=_(u'Save flight data...'), initialdir='~', initialfile=self.default_filename(), defaultextension=RAW_FILE_EXTENSION) if fname: # Try to remove previous file. # # User has been warned by asksaveasfilename # if she picked an existing file name. try: os.remove(fname) except OSError as e: # errno.ENOENT is 'no such file or directory'. # # Raise if another kind of error occurred. if e.errno != errno.ENOENT: raise # This method raises an exception if file already exists. raw_data.to_file(fname) return fname def suggest_open_in_viewer(self, filename): # User may want to see latest uploaded data. if filename: reply = askokcancel(_(u'Open in viewer'), _(u'Open saved flight data in file viewer?')) if reply: self.parent.load_file(filename) def erase(self): reply = askokcancel(_(u'Erase flight data'), _(u'Really erase all flight data in your altimeter?')) if reply: self.do_erase() def do_erase(self): # TODO Make message stay while erasing is performed. showwarning(_(u'Erasing...'), _(u'Do not disconnect USB until altimeter blue LED ' 'lights again.')) # Update window state. self.allow_user_interactions(False) self.communicating = True # Reset altimeter content. port = self.port.get() altimeter = Altimeter(port) try: altimeter.clear() except FlyDreamAltimeterSerialPortError: self.show_unfound_altimeter(port) except (FlyDreamAltimeterReadError, FlyDreamAltimeterWriteError) as e: self.show_readwrite_error(port, e.message) except FlyDreamAltimeterProtocolError as e: self.show_protocol_error(port, e.message) else: # Update altimeter information. self.upload_info.set(_(u'Altimeter content erased')) finally: # Restore window state. self.communicating = False self.allow_user_interactions() def set_frequency(self): # This request is almost immediate, # so let's not bother user with yet # another message box. # Update window state. self.allow_user_interactions(False) self.communicating = True # Change altimeter sampling frequency. freq = int(self.frequency.get()) port = self.port.get() altimeter = Altimeter(port) try: altimeter.setup(freq) except FlyDreamAltimeterSerialPortError: self.show_unfound_altimeter(port) except (FlyDreamAltimeterReadError, FlyDreamAltimeterWriteError) as e: self.show_readwrite_error(port, e.message) except FlyDreamAltimeterProtocolError as e: self.show_protocol_error(port, e.message) else: # Update altimeter information. self.upload_info.set(_(u'Altimeter sampling frequency set')) finally: # Restore window state. self.communicating = False self.allow_user_interactions() def show_unfound_altimeter(self, port): showwarning(_(u'Sampling Frequency'), _(u"""Can not open port: %s Please ensure that: - your altimeter is plugged to the USB adapter. - the USB adapter is plugged to your computer. - the choosen port is correct. - the USB adapter driver is properly installed on your computer, see http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx""") % port) def show_readwrite_error(self, port, message): showwarning(_(u'Read/Write error'), _(u"""With device on: %s Internal error message: %s Please ensure that: - the choosen port is correct. - your altimeter is plugged to the USB adapter. - the USB adapter is plugged to your computer. - you did not unplugged the altimeter while it was communicating.""") % (port, message)) def show_protocol_error(self, port, message): showwarning(_(u'Protocol error'), _(u"""With device on: %s Internal error message: %s Please ensure that: - your altimeter is plugged to the USB adapter. - you did not unplugged the altimeter while it was communicating.""") % (port, message)) def refresh_serial_ports(self): # Build port list. port_list = self.detect_serial_ports() # Remove previous items in combobox. menu = self.ports['menu'] menu.delete(0, tk.END) # Add new items in combobox. self.port.set(port_list[0]) for pr in port_list: menu.add_command(label=pr, command=lambda p=pr: self.port.set(p)) def detect_serial_ports(self): # Try to detect system serial devices. port_list = [] try: # Convert to filenames. port_list = [info[0].replace('cu', 'tty') for info in list_ports.comports()] except Exception as e: showwarning(_(u'Serial Ports Detection'), _(u'Error while detecting serial ports: %s') % e.message) # Insert default port as first entry. default = Altimeter().port try: # Try to remove default one to prevent duplication. port_list.remove(default) except ValueError: pass port_list.insert(0, default) return port_list
def initialize(self): self.title(_(u'FlyDream Altimeter - Device Controller')) # Set fixed size. self.minsize(640, 320) self.resizable(False, False) # Altimeter local device. frame = tk.Frame(self, height=self.PORT_SELECTION_FRAME_HEIGHT) frame.pack(fill=tk.BOTH, expand=tk.YES) tk.Label(frame, text=_(u'Altimeter plugged on:')).pack(side=tk.LEFT) self.detect = tk.Button(frame, text=_(u'Refresh'), command=self.refresh_serial_ports) self.detect.pack(side=tk.RIGHT) self.port = tk.StringVar(self) self.ports = tk.OptionMenu(frame, self.port, _(u'Detecting serial ports...')) self.ports.pack(fill=tk.X, expand=tk.YES) # Update possible serial ports. self.refresh_serial_ports() # Upload altimeter flight data. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Upload')) label.pack(side=tk.TOP, fill=tk.X) # Setup bold font for titles. f = Font(font=label['font']) f['weight'] = 'bold' label['font'] = f.name Separator(frame).pack(fill=tk.X) self.progressbar = Progressbar(frame, orient='horizontal', mode='determinate') self.progressbar.pack(side=tk.BOTTOM, fill=tk.X) # Do not show progressbar # unless data is uploaded. self.hide_progressbar() self.upload_info = tk.StringVar() self.upload_info.set('/') self.info_label = tk.Label(frame, anchor=tk.NE, fg='darkgrey', textvariable=self.upload_info) self.info_label.pack(side=tk.BOTTOM, fill=tk.BOTH) self.label = tk.Label(frame, anchor=tk.W, text=_(u'Tell the altimeter to send flight ' 'data to your computer')) self.label.pack(side=tk.LEFT) self.upload = tk.Button(frame, text=_(u'Upload data'), command=self.upload) self.upload.pack(side=tk.RIGHT) # Erase altimeter flight data. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Clear')) label['font'] = f.name label.pack(side=tk.TOP, fill=tk.X) Separator(frame).pack(fill=tk.X) label = tk.Label(frame, anchor=tk.W, text=_(u'Delete all the flight data from your altimeter')) label.pack(side=tk.LEFT) self.erase = tk.Button(frame, text=_(u'Erase data'), command=self.erase) self.erase.pack(side=tk.RIGHT) # Setup altimeter sampling frequency. frame = tk.Frame(self, padx=self.SUB_FRAME_X_PADDING) frame.pack(fill=tk.BOTH, expand=tk.YES) label = tk.Label(frame, anchor=tk.W, text=_(u'Configure')) label['font'] = f.name label.pack(side=tk.TOP, fill=tk.X) Separator(frame).pack(fill=tk.X) self.frequency = tk.StringVar(self) self.frequency.set('1') self.frequencies = tk.OptionMenu(frame, self.frequency, '1', '2', '4', '8') self.frequencies.pack(side=tk.LEFT) label = tk.Label(frame, text=_(u'records per second')) label.pack(side=tk.LEFT) self.setup = tk.Button(frame, text=_(u'Set sampling frequency'), command=self.set_frequency) self.setup.pack(side=tk.RIGHT)
class InteractionWindow(Canvas): def __init__(self, master, _ndpi_file): self.master = master # For WBC-hunt self.hunter = False # Call the super constructor Canvas.__init__(self, master) #self.canvas = Canvas(self, master) # Zoom or roi mode (defaults to roi) self.mode = "roi" # Setup the input file self.ndpi_file = _ndpi_file self.im = None # Actual PhotoImage object of the image self.rgba_im = None # This is needed as a kept reference so that we can resize image on user action self.current_level = None # Scale space level currently used for viewing (for handling zoom etc) self.image_handle = None # Used to delete and recreate images self.setup_image() # Stuff for box selection self.init_box_pos = None # In WINDOW coordinates self.curr_box_bbox = None # Also in current WINDOW coordinates self.last_selection_region = None # This is in level 0 coordinates self.zoom_level = 0 # How many times have we zoomed? self.zoom_region = [] # Stack of regions in level 0 coords that tells us where the zoom is, needed for transforming # Since we want multiple ROIs, save them in this list self.roi_list = [] # Contains Triple: (ROInumber, ROI_imagedata, (bbox, [sub_rois_list])) self.roi_counter = 0 self.progress = Progressbar(self, orient="horizontal", length=100, mode="determinate", value=0) # ProgressBar to show user what is going on. Only one active at a time # Bind some event happenings to appropriate methods self.bind('<Configure>', self.resize_image) self.bind('<B1-Motion>', self.select_box) self.bind('<Button-1>', self.set_init_box_pos) self.bind('<ButtonRelease-1>', self.set_box) self.bind('<Button-3>', self.zoom_out) self.bind('<Left>', self.move_up) # DEBUG self.counter = 0 # Handles initial setup of the input image def setup_image(self): # Select best scale space level and get its size # First get current canvas size, to determine the downsampling factor' self.master.update() # Redraw screen so that the sizes are correct factor = float(self.ndpi_file.level_dimensions[0][0])/float(self.winfo_width()) self.current_level = self.ndpi_file.get_best_level_for_downsample(factor) self.rgba_im = self.ndpi_file.read_region((0, 0), self.current_level, self.ndpi_file.level_dimensions[self.current_level]) self.rgba_im = self.rgba_im.resize((self.winfo_width(), self.winfo_height())) # Use TKs PhotoImage to show the image (needed for selecting ROIs) self.im = itk.PhotoImage(self.rgba_im) self.image_handle = self.create_image(0, 0, image=self.im, anchor=NW) # Whenever all ROIs and subROIs need to be redrawn, call this def redraw_ROI(self): # Start with drawing all main (red) rois for num, roi_container, bbox_container in self.roi_list: sub_rois = bbox_container[1] bbox = bbox_container[0] if len(sub_rois) is not 0: for sub_roi in sub_rois: self.draw_rectangle(sub_roi, "green", 5, "subroi" + str(num)) self.draw_rectangle(bbox, "red", 4, "roi"+str(num)) # Method that ensures automatic resize in case the windows is resized by the user def resize_image(self, event): try: new_width = event.width new_height = event.height except AttributeError: #print "Attribute error in resize. Trying tuple variant. You are most probably in zoom mode so don't worry." new_width = event[0] new_height = event[1] self.master.update() # Redraw screen so that the sizes are correct if self.last_selection_region is not None: factor = float(self.last_selection_region[1][1])/float(self.winfo_width()) else: factor = float(self.ndpi_file.level_dimensions[0][0])/float(self.winfo_width()) print "Factor: " + str(factor) self.current_level = self.ndpi_file.get_best_level_for_downsample(factor) print "Current level: " + str(self.current_level) # We have to make sure that we only show the zoomed-in area if self.last_selection_region is not None:# and self.mode is "zoom": self.render_status_text((100, 100), "Zooming...", 0, 50) # Need to transform l0 coordinates to coordinates of current_level, but only width and height! width, height = self.transform_to_arb_level(self.last_selection_region[1][0], self.last_selection_region[1][1], self.current_level) self.rgba_im = self.ndpi_file.read_region(self.last_selection_region[0], # The x and y needs to be in l0... self.current_level, (int(width), int(height))) else: self.rgba_im = self.ndpi_file.read_region((0, 0), self.current_level, self.ndpi_file.level_dimensions[self.current_level]) self.rgba_im = self.rgba_im.resize((new_width, new_height)) self.im = itk.PhotoImage(self.rgba_im) self.delete(self.image_handle) self.create_image(0, 0, image=self.im, anchor=NW) self.clear_status_text() def set_init_box_pos(self, event): # If we are in clear mode, make sure that we handle it correctly. if self.mode is "clear": # First transform the coordinates to level 0 (mouse_x, mouse_y) = self.transform_to_level_zero(event.x, event.y) # Loop through roi_list and see if we clicked on one of them for num, roi, bbox_container in self.roi_list: bbox = bbox_container[0] if bbox[0][0] < mouse_x < bbox[0][0]+bbox[1][0]: if bbox[0][1] < mouse_y < bbox[0][1]+bbox[1][1]: # Found a ROI! self.delete("roi"+str(num)) self.delete("boxselector") self.delete("subroi"+str(num)) self.roi_list.remove((num, roi, bbox_container)) break else: self.init_box_pos = (event.x, event.y) # From level 0 to arbitrary level coordinates def transform_to_arb_level(self, x_coord, y_coord, to_level): # We know that x and y are in level 0. factor = self.ndpi_file.level_downsamples[to_level] return float(x_coord)/factor, float(y_coord)/factor # From window coordinates to level 0 coordinates def transform_to_level_zero(self, x_coord, y_coord): x_percent = float(x_coord)/self.winfo_width() y_percent = float(y_coord)/self.winfo_height() if self.zoom_level is 0: ld = self.ndpi_file.level_dimensions[0] return x_percent*ld[0], y_percent*ld[1] else: ld = self.zoom_region[-1] return x_percent*ld[1][0]+ld[0][0], y_percent*ld[1][1]+ld[0][1] # Member function for clearing all ROI def clear_all_roi(self): for num, roi_container, bbox_container in self.roi_list: sub_rois = bbox_container[1] if len(sub_rois) is not 0: self.delete("subroi" + str(num)) self.delete("roi"+str(num)) self.roi_list = [] self.roi_counter = 0 self.delete("boxselector") def select_box(self, event): bbox = (event.x, event.y) self.curr_box_bbox = (self.init_box_pos, bbox) self.delete("boxselector") # Depending on the mode, we get different colors on the box if self.mode is "roi": width = self.curr_box_bbox[1][0] height = self.curr_box_bbox[1][1] topx = self.curr_box_bbox[0][0] topy = self.curr_box_bbox[0][1] l0_width, l0_height = self.transform_to_level_zero(width, height) l0_topx, l0_topy = self.transform_to_level_zero(topx, topy) # Get absolute pixel differences l0_width = abs(l0_width - l0_topx) l0_height = abs(l0_height - l0_topy) if (l0_width > 1000) or (l0_height > 1000): self.create_rectangle(self.curr_box_bbox, outline="red", tags="boxselector") else: self.create_rectangle(self.curr_box_bbox, outline="yellow", tags="boxselector") elif self.mode is "zoom": self.create_rectangle(self.curr_box_bbox, outline="green", tags="boxselector") # Lets us render a status bar, letting users know how far something has gotten def render_status_text(self, position, text, percentage, length): percentage = int(percentage*100.0) x = position[0] y = position[1] self.progress["length"] = length self.progress["value"] = percentage self.progress.place(x=x, y=y) self.create_text(x, y, text=text, anchor=SW, font=("Purisa", 16), tags="progresstext", fill="white") self.master.update() def clear_status_text(self): self.progress.place_forget() self.delete("progresstext") self.master.update() def set_box(self, event): # This is executed when the user has dragged a selection box (either zoom or ROI) and he/she has now let go of # the mouse. Our goal here is to get the level 0 coordinates of this box and then pass this box on depending # on what we want to do. width = self.curr_box_bbox[1][0] height = self.curr_box_bbox[1][1] topx = self.curr_box_bbox[0][0] topy = self.curr_box_bbox[0][1] l0_width, l0_height = self.transform_to_level_zero(width, height) l0_topx, l0_topy = self.transform_to_level_zero(topx, topy) # Get absolute pixel differences l0_width = abs(l0_width - l0_topx) l0_height = abs(l0_height - l0_topy) # We need to be able to access this region in the resize function self.last_selection_region = [(int(l0_topx), int(l0_topy)), (int(l0_width), int(l0_height))] #entire_roi = numpy.array(self.ndpi_file.read_region((int(l0_topx), int(l0_topy)), 0, (int(l0_width), int(l0_height))), dtype=numpy.uint8) # Multiply percentages of totals and transform to high res level # ------------------NEW---------------- # Code below is ugly, might be able to reduce it to single double loop # Check if the ROI is too big, in that case split it and put into list box = [] sub_rois = [] # Needed for drawing the subrois later on if not self.hunter: """ if self.mode is "roi" and (l0_width > 1000 or l0_height > 1000): fixed_size = 500.0 no_of_x_subrois = math.floor(float(l0_width)/float(fixed_size)) no_of_y_subrois = math.floor(float(l0_height)/float(fixed_size)) total = (no_of_x_subrois+1.0)*(no_of_y_subrois+1.0) # The total number of subrois needed to be done counter = 0 # Used for knowing how far we've gotten in the loops for curr_x in range(int(no_of_x_subrois)): for curr_y in range(int(no_of_y_subrois)): curr_topx = l0_topx + fixed_size*float(curr_x) curr_topy = l0_topy + fixed_size*float(curr_y) box.append(numpy.array(self.ndpi_file.read_region((int(curr_topx), int(curr_topy)), 0, (int(fixed_size), int(fixed_size))), dtype=numpy.uint8)) # For now, just print boxes to show where we cut it roi = [(int(curr_topx), int(curr_topy)), (int(fixed_size), int(fixed_size))] sub_rois.append(roi) # Render a status text aswell counter += 1 self.render_status_text((topx, topy-20), "Reading data...", float(counter)/total, width-topx) # Now we need to handle the rest of the ROI that didn't fit perfectly into the fixed_size boxes # Remember, this also sort of needs to loop # Idea: Fix x or y, loop through the other one # Start with looping over x, y is fixed topy_rest = float(l0_topy) + no_of_y_subrois*fixed_size height_rest = (float(l0_topy) + float(l0_height)) - float(topy_rest) for curr_x in range(int(no_of_x_subrois)): curr_topx = l0_topx + fixed_size*float(curr_x) box.append(numpy.array(self.ndpi_file.read_region((int(curr_topx), int(topy_rest)), 0, (int(fixed_size), int(height_rest))), dtype=numpy.uint8)) roi = [(int(curr_topx), int(topy_rest)), (int(fixed_size), int(height_rest))] sub_rois.append(roi) # Render a status text aswell counter += 1 self.render_status_text((topx, topy-20), "Reading data...", float(counter)/total, width-topx) # Now loop over y and x is fixed topx_rest = float(l0_topx) + no_of_x_subrois*fixed_size width_rest = (float(l0_topx) + float(l0_width)) - float(topx_rest) for curr_y in range(int(no_of_y_subrois)): curr_topy = l0_topy + fixed_size*float(curr_y) box.append(numpy.array(self.ndpi_file.read_region((int(topx_rest), int(curr_topy)), 0, (int(width_rest), int(fixed_size))), dtype=numpy.uint8)) roi = [(int(topx_rest), int(curr_topy)), (int(width_rest), int(fixed_size))] sub_rois.append(roi) # Render a status text aswell counter += 1 self.render_status_text((topx, topy-20), "Reading data...", float(counter)/total, width-topx) # This is the last one, in the lower right corner topx_rest = float(l0_topx) + no_of_x_subrois*fixed_size topy_rest = float(l0_topy) + no_of_y_subrois*fixed_size width_rest = (float(l0_topx) + float(l0_width)) - float(topx_rest) height_rest = (float(l0_topy) + float(l0_height)) - float(topy_rest) roi = [(int(topx_rest), int(topy_rest)), (int(width_rest), int(height_rest))] sub_rois.append(roi) # Render a status text aswell counter += 1 self.render_status_text((topx, topy-20), "Reading data...", float(counter)/total, width-topx) tmp = self.ndpi_file.read_region((int(topx_rest), int(topy_rest)), 0, (int(width_rest), int(height_rest))) box.append(numpy.array(tmp, dtype=numpy.uint8)) """ # Now depending on the mode, do different things if self.mode is "roi": # This is the case that the ROI selected is small enough to be alone box.append(numpy.array(self.ndpi_file.read_region((int(l0_topx), int(l0_topy)), 0, (int(l0_width), int(l0_height))), dtype=numpy.uint8)) if self.mode is "roi": print "No of subboxes in roi you just selected: " + str(len(box)) if self.hunter: box.append(numpy.array(self.ndpi_file.read_region((int(l0_topx), int(l0_topy)), 0, (int(l0_width), int(l0_height))), dtype=numpy.uint8)) self.set_roi(box, sub_rois) elif self.mode is "zoom": self.zoom() self.delete("boxselector") self.clear_status_text() def set_roi(self, box, sub_rois): # Add the ROI to our list if not self.hunter: self.roi_list.append((self.roi_counter, box, (self.last_selection_region, sub_rois))) else: new_region = [self.last_selection_region[0], (500, 500)] self.roi_list.append((self.roi_counter, box, (new_region, sub_rois))) # Keep drawing the ROIs self.redraw_ROI() self.roi_counter += 1 #self.create_text(self.curr_box_bbox[0][0], self.curr_box_bbox[0][1], text=str(len(self.roi_list)), # anchor=SW, font=("Purisa", 16), tags="roi"+str(len(self.roi_list))) def draw_rectangle(self, level_0_coords, outline, line_width, tag): # We need to transform the level 0 coords to the current window #factor = 1.0/self.ndpi_file.level_downsamples[self.current_level] top_x = level_0_coords[0][0] top_y = level_0_coords[0][1] width = level_0_coords[1][0] height = level_0_coords[1][1] # Get the percentages if self.zoom_level is 0: ld = self.ndpi_file.level_dimensions[0] else: ld = self.zoom_region[-1][1] top_x = top_x - self.zoom_region[-1][0][0] top_y = top_y - self.zoom_region[-1][0][1] top_x_percent = float(top_x)/ld[0] top_y_percent = float(top_y)/ld[1] width_percent = float(width)/ld[0] height_percent = float(height)/ld[1] top_x_view = top_x_percent*self.winfo_width() top_y_view = top_y_percent*self.winfo_height() width_view = width_percent*self.winfo_width() height_view = height_percent*self.winfo_height() box = [(top_x_view, top_y_view), (width_view+top_x_view, height_view+top_y_view)] self.create_rectangle(box, outline=outline, tags=tag, width=line_width) def zoom(self): # Set the zoom_region in level 0 coords x, y = self.transform_to_level_zero(self.curr_box_bbox[0][0], self.curr_box_bbox[0][1]) width, height = self.transform_to_level_zero(self.curr_box_bbox[1][0], self.curr_box_bbox[1][1]) self.zoom_region.append([(int(x), int(y)), (int(width-x), int(height-y))]) self.zoom_level += 1 self.resize_image((self.winfo_width(), self.winfo_height())) # We also need to make sure that the ROIs are (visually) transformed to the new zoom level self.redraw_ROI() def move_up(self, event): print "HEEEEJ" self.move(self.image_handle, 0, 10) # Right click zooms to previous zoom level def zoom_out(self, event): if self.zoom_level is not 0: if self.zoom_level is 1: self.reset_zoom() else: # Pop one off of the stack and reduce the zoom level by 1 self.zoom_region.pop() self.zoom_level -= 1 # The selection_region is used when resizing, so simulate that we just selected a region that is further # down the zoom stack self.last_selection_region = self.zoom_region[-1] self.resize_image((self.winfo_width(), self.winfo_height())) self.redraw_ROI() def reset_zoom(self): self.last_selection_region = None self.zoom_region = [] self.zoom_level = 0 self.resize_image((self.winfo_width(), self.winfo_height())) self.redraw_ROI() def run_roi(self): if not self.hunter: # Loop through the roi list and do segmentation and classification for each roi cell_list = [] # Initial loop to get the total amount of rois to do, for the progress bar total_no_of_rois = 0 for num, rois, bbox_container in self.roi_list: for roi in rois: test = ImageShower(self, roi, "Before segmentation, roi number " + str(num)) #scipy.misc.imsave('testttttttt.png', roi) im = Image.fromarray(roi) im.save('../results/before_segmentation_roi_' + str(num) + '.png') total_no_of_rois += 1 print "Total no of rois to do: " + str(total_no_of_rois) # Counter for the progress bar counter = 0 for num, rois, bbox_container in self.roi_list: #rois = roi_container[1] for roi in rois: tmp_list, new_roi = rbc_seg.segment_and_remove_from_roi(roi) cell_list = cell_list + tmp_list # Show a segmented version of the ROI, "intermediate result" test = ImageShower(self, new_roi, "After segmentation, roi number " + str(num)) im = Image.fromarray(new_roi) im.save('../results/after_segmentation_roi_' + str(num) + '.png') # Also make a progress bar counter += 1 self.render_status_text((100, 100), "Running segmentation...", float(counter/float(total_no_of_rois)), 100) self.clear_status_text() # Call the classification if len(cell_list) is 0: show_msg("No WBC", self, "Only RBCs were detected in this/these roi/rois.") else: prediction = classer.predict_cells(cell_list) print "No of classified unknowns: " + str(len(prediction)) #numpy.save("red_shit2.npy", self.roi_list[len(self.roi_list)-1][1][0]) test = ResultDisplayer(cell_list, prediction) """ testimg = cv2.imread("../npyimages/only_whites_3.png") testimg = cv2.cvtColor(testimg, cv2.COLOR_BGR2RGB) cell_list = rbc_seg.segmentation(testimg) prediction = classer.predict_cells(cell_list) test = ResultDisplayer(cell_list, prediction) #fff = open('../only_smeared.pik', 'w+') #pickle.dump(cell_list, fff)""" if self.hunter: for num, rois, bbox_container in self.roi_list: #rois = roi_container[1] for roi in rois: numpy.save("../npyimages/c_test" + str(self.counter) + ".npy", roi) self.counter += 1