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)
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
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 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
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 LowerScrollingFrame(ScrollableFrame): #self.mangaFrame ==> the MangaFrame that we get our image and updates from def __init__(self,parent,*args,**kwargs): self.parent=parent ScrollableFrame.__init__(self,self.parent,*args,**kwargs) self.disableDynamicRows() #really annoying to have it on self.__body() self.mangaFrame=None self.imageNotFound=self.image=ImageTk.PhotoImage(Image.open("Image-not-found.gif")) self.image=self.imageNotFound self.redraw() 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 setManga(self,MangaFrame): #this should be a manga frame self.mangaFrame=MangaFrame self.image=self.mangaFrame.getImage() self.redraw() def redraw(self,*args): try: if self.mangaFrame.inProgress==False:self.BUTTONS["Update"].config(text="Update") else:self.BUTTONS["Update"].config(text="Cancel") self.LABELS["ChapterCount"].config(text="{} Chapters".format(self.mangaFrame.numberOfChapters())) self.LABELS["Updates"].config(text="{} Updates".format(self.mangaFrame.numberOfUpdates())) self.progressSet(self.mangaFrame.getProgress()) self.LABELS["UpdatingStatus"].config(text=self.mangaFrame.getStatus()) self.LABELS["Summary"].config(text="Summary: "+self.mangaFrame.getSummary()) except Exception as e: print e self.LABELS["Status"].config(text="Status:\nUnknown") self.LABELS["ChapterCount"].config(text="Chapters:\nUnknown") self.LABELS["Updates"].config(text="Updates:\nUnknown") self.progressReset() self.LABELS["UpdatingStatus"].config(text="") self.LABELS["Summary"].config(text="Summary:\nUnknown") self.LABELS["Picture"].config(image=self.image) def progressSet(self,value): self.PROGRESSBAR.config(value=value) def progressStep(self,value): self.PROGRESSBAR.step(value) def progressReset(self): self.PROGRESSBAR.config(value=0) def updateManga(self): if not self.mangaFrame.inProgress:self.mangaFrame.updateManga(self) else: self.mangaFrame.cancelUpdate() self.redraw() def updateManga_check(self): self.mangaFrame.updateManga_check() #look to see if there are any updates self.redraw() #change the number we have for the number of updates def deleteManga(self): rmtree("files/"+self.mangaFrame.getName()) self.parent.populateLibrary() self.mangaFrame=None self.image=self.imageNotFound self.redraw()
class RunningOperationsPage(BaseInputPage, object): def __init__(self, parent, controller, frame_number): BaseInputPage.__init__(self, parent, controller, frame_number) self.move_back = False self.need_subjects_file = False self.downloaded_file_path = '~/Downloads/' self.operation = Operations(self.controller) self.start = tk.Button(self, text='Start Execution', command=lambda : self.executeCommand()) self.start.grid(row=self.starting_row, column=0, sticky='W', padx=5, pady=3) self.stop = tk.Button(self, text='Stop Execution', state="disabled", command=lambda : self.terminateCommand()) self.stop.grid(row=self.starting_row, column=2, sticky='E', padx=5, pady=3) self.progressbar = Progressbar(self) self.progressbar.configure(mode='determinate', max=100) self.progressbar.grid(row=self.starting_row+1, column=0, columnspan=3, sticky='ew', padx=10, pady=10) self.controller.progressbar = self.progressbar self.output = Text(self, height=15, width=100) self.output.grid(row=self.starting_row+2, column=0, columnspan=3, sticky='ew', padx=10) self.hyperlink = HyperlinkManager(self.output) self.lf_subject_file = LabelFrame(self, text='Visual QC', padx=15, font='Helvetica 14 bold') self.lf_subject_file.grid(row=self.starting_row+3, column=0, columnspan=3, sticky='WE', padx=5, pady=5, ipadx=5, ipady=5) self.lf_subject_file.grid_rowconfigure(0, weight=1) self.lf_subject_file.grid_columnconfigure(4, weight=1) createToolTip(self.lf_subject_file, self.controller.desc.subject_file) self.lb_subject_file = Label(self.lf_subject_file, text="Select flagged subjects textfile", font='Helvetica 13 bold') self.lb_subject_file.grid(row=0, column=0, sticky="W", pady=3) self.select = tk.Button(self.lf_subject_file, text='Select flagged subjects file', command=lambda : self.chooseFile(self, controller, controller.selected_subjects, 'Selected Subjects', default_dir=self.downloaded_file_path)) self.select.grid(row=1, column=0, sticky='W', padx=5, pady=3) lb_or = Label(self.lf_subject_file, text="-OR-", font='Helvetica 13 bold') lb_or.grid(row=1, column=1, sticky="W", pady=3) self.continue_with_all_sub = tk.Button(self.lf_subject_file, text='Continue with all subjects', command=lambda : self.continueWithAllSub()) self.continue_with_all_sub.grid(row=1, column=2, sticky='W', padx=10, pady=3) self.controller.display = self.output def chooseFile(self, parent, controller, place_holder, message, default_dir=''): super(RunningOperationsPage, self).chooseFile(parent, controller, place_holder, message, default_dir=default_dir) self.executeCommand() def setFrameTitle(self): self.title.set('Press Start Execution') def onShowFrame(self, event): super(RunningOperationsPage, self).onShowFrame(event) self.resetAll() self.silentMode() def resetAll(self): self.resetUI() self.operation.resetOperations() def moveToNextPage(self): super(RunningOperationsPage, self).moveToNextPage() def resetClickCounter(self): self.move_back = False self.setRequiredInputError('') def userAgreed(self): if self.move_back: return True self.setRequiredInputError('Warning: All progress will be lost. If you wish to continue, press the button again.') self.move_back = True return False def moveToPrevPage(self): if self.userAgreed(): self.resetAll() super(RunningOperationsPage, self).moveToPrevPage() def resetUI(self): self.start.config(state="normal") self.start.config(text='Start Execution') self.btn_prev.config(state="normal") self.btn_next.config(state="disabled") self.stop.config(state="disabled") self.output.delete('1.0', END) self.title.set("Press 'Start Execution' to begin") self.progressbar.config(value=0) self.need_subjects_file = False self.disableChildren(self.lf_subject_file.winfo_children()) self.resetClickCounter() def continueWithAllSub(self): self.need_subjects_file = False self.executeCommand() def silentMode(self): if self.controller.silent: self.executeCommand() def executeCommand(self): if self.start['text'] == 'Continue Execution' and self.need_subjects_file and not self.controller.silent: selected_subjects_file_path = self.controller.selected_subjects.get() new_subjects = [] try: with open(selected_subjects_file_path, 'r') as f: new_subjects = f.readlines() new_subjects = [subj.strip() for subj in new_subjects] self.downloaded_file_path = os.path.dirname(selected_subjects_file_path) self.controller.selected_subjects.set('') self.operation.updateSubjects(new_subjects) self.setRequiredInputError('') self.need_subjects_file = False except Exception as e: self.controller.logger.error(e.message) self.controller.logger.error(traceback.format_exc()) self.setRequiredInputError('Please import correct textfile downloaded from the QC page.') return False self.disableChildren(self.lf_subject_file.winfo_children()) self.start.config(state="disabled") self.stop.config(state="normal") self.resetClickCounter() if self.start['text'] == 'Continue Execution': self.operation.incrementStage() self.title.set('Please wait') self.operation.startThreads(self) def terminateCommand(self): if self.userAgreed(): self.stop.config(state="disabled") self.operation.stopThreads() def pause(self, operation_name='', data='', need_pause=False): if need_pause and not self.controller.silent: self.start.config(state="disabled") self.start.config(text='Continue Execution') self.title.set('Please input subject file') self.btn_prev.config(state="normal") self.stop.config(state="disabled") self.resetClickCounter() self.need_subjects_file = True self.enableChildren(self.lf_subject_file.winfo_children()) if data: self.insertHyperLink(operation_name, data) def finished(self, operation_name='', data=''): self.start.config(text="Start Execution") self.start.config(state="disabled") self.btn_prev.config(state="normal") self.stop.config(state="disabled") self.title.set('Completed') self.controller.updateMessage('All operations completed. You may now close the application.') self.resetClickCounter() if data: self.insertHyperLink(operation_name, data) def insertHyperLink(self, heading, link): self.output.insert(END, '\n\n') self.output.insert(END, "QC Page for " + heading, self.hyperlink.add(partial(webbrowser.open, link))) self.output.insert(END, '\n\n') self.output.see(END) def toggleChildren(self): self.disableChildren(self.lf_subject_file.winfo_children()) def disableChildren(self, childList): for child in childList: try: self.disableChildren(child.winfo_children()) except: pass try: child.configure(state='disable') except: pass def enableChildren(self, childList): for child in childList: try: self.enableChildren(child.winfo_children()) except: pass try: child.configure(state='normal') except: pass
class YoutubeScript: def __init__(self): self.totDownloadSize = 0 self.completedSize = 0 self.saveData = { "url": "", "title": "", "selected": [], "completed": [], "savetype": "" } def initUi(self): self.ipGui = Tk() self.ipGui.wm_title("YtD by T90") self.ipGui.wm_minsize(700, 150) self.titleFrame = Frame(self.ipGui, height=100, width=500, relief=RAISED, bg="#555") self.titleFrame.pack(fill=BOTH) titleLabel = Label(self.titleFrame, text="Youtube Downloader Script", bg="#555", fg="#fff", font=("Arial", 16)) subTitleLabel = Label(self.titleFrame, text="By T90", bg="#555", fg="#ddd") titleLabel.pack(fill=X, side=TOP, pady=3) subTitleLabel.pack(fill=X, side=BOTTOM) self.ipFrame = Frame(self.ipGui, height=200, width=500, relief=RAISED, bg="#bbb") self.ipFrame.pack(fill=BOTH, padx=3, pady=3) self.urlBox = Entry(self.ipFrame, relief=RAISED, fg="#777") self.urlBox.focus() self.urlBtn = Button(self.ipFrame, text="Download", height=2, bg="#777", fg="#eee", command=self.startDownload) self.urlBox.pack(fill=BOTH, padx=20, pady=10) self.urlBtn.pack(fill=BOTH, padx=50, pady=10) # self.urlBox.insert(0, "https://www.youtube.com/playlist?list=PLYvPGplh5--N1zwtg_5-z3kVW9U92FUc2") self.selectVidsFrame = Frame(self.ipGui, bg="#bbb") selectLabel = Label(self.selectVidsFrame, text="Select videos to be downloaded and click on Start.", bg="#bbb") self.vidsListBox = Listbox(self.selectVidsFrame, bg="#bbb", relief=RAISED, selectmode=EXTENDED, selectbackground="#888", selectforeground="#fff", borderwidth=1, highlightthickness=0, activestyle="none") self.selectVidsBtn = Button(self.selectVidsFrame, text="Start", height=2, bg="#777", fg="#eee", command=self.selectVids) selectLabel.pack(fill=X, padx=3, pady=3) self.vidsListBox.pack(fill=X, padx=10, pady=10) self.selectVidsBtn.pack(fill=X, padx=50, pady=10) self.progFrame = Frame(self.ipGui, height=200, width=500, relief=SUNKEN, bg="#bbb") self.titleInProgFrame = Frame(self.progFrame, bg="#bbb") self.status1InProgFrame = Frame(self.progFrame, bg="#bbb") self.status2InProgFrame = Frame(self.progFrame, bg="#bbb") self.progInProgFrame = Frame(self.progFrame, bg="#bbb") self.vidTitleLabel = Label(self.titleInProgFrame, text="Fetching videos, please wait...", bg="#bbb", fg="#333") self.thisVidCompletedTitle = Label(self.status1InProgFrame, text="Completed:", bg="#bbb", fg="#333", justify="right") self.thisVidCompletedText = Label(self.status1InProgFrame, text="0 MB", bg="#bbb", fg="#333", justify="left") self.thisVidSizeTitle = Label(self.status1InProgFrame, text="Size:", bg="#bbb", fg="#333", justify="right") self.thisVidSizeText = Label(self.status1InProgFrame, text="calculating", bg="#bbb", fg="#333", justify="left") self.totVidCompletedTitle = Label(self.status1InProgFrame, text="Total downloaded:", bg="#bbb", fg="#333", justify="right") self.totVidCompletedText = Label(self.status1InProgFrame, text="0 MB", bg="#bbb", fg="#333", justify="left") self.totVidSizeTitle = Label(self.status1InProgFrame, text="Total Size:", bg="#bbb", fg="#333", justify="right") self.totVidSizeText = Label(self.status1InProgFrame, text="calculating", bg="#bbb", fg="#333", justify="left") self.curSpeedTitle = Label(self.status2InProgFrame, text="Speed:", bg="#bbb", fg="#333", justify="right") self.curSpeedText = Label(self.status2InProgFrame, text="0 mbps", bg="#bbb", fg="#333", justify="left") self.vidLengthTitle = Label(self.status2InProgFrame, text="Video duration:", bg="#bbb", fg="#333", justify="right") self.vidLengthText = Label(self.status2InProgFrame, text="calculating", bg="#bbb", fg="#333", justify="left") self.etaTitle = Label(self.status2InProgFrame, text="ETA:", bg="#bbb", fg="#333", justify="right") self.etaText = Label(self.status2InProgFrame, text="calculating", bg="#bbb", fg="#333", justify="left") self.timeTakenTitle = Label(self.status2InProgFrame, text="Time Taken:", bg="#bbb", fg="#333", justify="right") self.timeTakenText = Label(self.status2InProgFrame, text="calculating", bg="#bbb", fg="#333", justify="left") self.totProgLabel = Label(self.progInProgFrame, text="Total Progress", bg="#bbb", fg="#333") s = Style() s.theme_use('alt') s.configure("grey.Horizontal.TProgressbar", foreground='#eee', background='#888') self.indiProg = Progressbar(self.progInProgFrame, style="grey.Horizontal.TProgressbar", orient='horizontal', mode='determinate', maximum=100) self.totProg = Progressbar(self.progInProgFrame, style="grey.Horizontal.TProgressbar", orient='horizontal', mode='determinate', maximum=100) self.openDownloadFolderBtn = Button(self.progInProgFrame, text="Open Download Location", height=2, bg="#777", fg="#eee", command=self.openDownloadFolder) self.titleInProgFrame.pack(fill=BOTH, expand=1) self.status1InProgFrame.pack(fill=BOTH, expand=1) self.status2InProgFrame.pack(fill=BOTH, expand=1) self.progInProgFrame.pack(fill=BOTH, expand=1) self.vidTitleLabel.pack(fill=BOTH, expand=1, padx=50, pady=10, side=TOP) self.thisVidCompletedTitle.pack(fill=BOTH, expand=1, side=LEFT) self.thisVidCompletedText.pack(fill=BOTH, expand=1, side=LEFT) self.thisVidSizeTitle.pack(fill=BOTH, expand=1, side=LEFT) self.thisVidSizeText.pack(fill=BOTH, expand=1, side=LEFT) self.totVidCompletedTitle.pack(fill=BOTH, expand=1, side=LEFT) self.totVidCompletedText.pack(fill=BOTH, expand=1, side=LEFT) self.totVidSizeTitle.pack(fill=BOTH, expand=1, side=LEFT) self.totVidSizeText.pack(fill=BOTH, expand=1, side=LEFT) self.curSpeedTitle.pack(fill=BOTH, expand=1, side=LEFT) self.curSpeedText.pack(fill=BOTH, expand=1, side=LEFT) self.vidLengthTitle.pack(fill=BOTH, expand=1, side=LEFT) self.vidLengthText.pack(fill=BOTH, expand=1, side=LEFT) self.etaTitle.pack(fill=BOTH, expand=1, side=LEFT) self.etaText.pack(fill=BOTH, expand=1, side=LEFT) self.timeTakenTitle.pack(fill=BOTH, expand=1, side=LEFT) self.timeTakenText.pack(fill=BOTH, expand=1, side=LEFT) self.indiProg.pack(fill=BOTH, expand=1, padx=50, pady=10) self.totProgLabel.pack(fill=BOTH, expand=1) self.totProg.pack(fill=BOTH, expand=1, padx=50, pady=10) self.openDownloadFolderBtn.pack(fill=BOTH, expand=1, padx=90, pady=10) def saveData(self, status="auto"): self.saveData['url'] = self.url self.saveData['title'] = self.pafy['title'] self.saveData['savetype'] = status self.saveData['selected'] = self.selectedIndexList self.saveData['completed'] = self.completedVids pickle.dump(self.saveData, "saves/saveFile_" + str(int(time.time()))) def getUrlandStart(self): try: urllib.urlretrieve("http://youtube.com/favicon.ico", "favicon.ico") self.initUi() self.ipGui.iconbitmap(r'favicon.ico') self.ipGui.mainloop() except Exception as e: print e.message root = Tk() root.withdraw() tkMessageBox.showerror("Connectivity Issues", "Connectivity issue detected. " "Please make sure that you are connected to the Internet and then restart the app.") exit(0) def startDownload(self): if not os.path.exists("downloads"): os.mkdir("downloads") self.urlBtn.config(text="Loading...") self.ipGui.update() self.url = self.urlBox.get() if "watch" in self.url and "list" in self.url: parts = self.url.split("&") for part in parts: if "list=" in part: self.url = "https://www.youtube.com/playlist?" + part break self.ipFrame.pack_forget() if "playlist" in self.url: self.selectVidsFrame.pack(fill=BOTH, padx=3, pady=3) self.vidsListBox.focus() self.pafy = pafy.get_playlist(self.url) self.ipGui.wm_title(self.pafy['title']) self.vidsObjs = [] i = 0 for vid in self.pafy['items']: self.vidsObjs.append(vid) i += 1 self.vidsListBox.insert(END, str(i) + ". " + vid['playlist_meta']['title'] + " [" + str( round(int(vid['playlist_meta']['length_seconds']) / 60, 2)) + "min]") def selectVids(self): items = self.vidsListBox.curselection() self.selectedIndexList = items if len(items) == 0: tkMessageBox.showerror("No video selected", "No videos selected.\nPlease select some videos and press start. " "Select multiple videos using Shift/Ctrl.") return self.selectedList = [] for item in items: self.selectedList.append(self.vidsObjs[item]) self.selectVidsFrame.pack_forget() self.progFrame.pack(fill=BOTH, padx=3, pady=3) self.selectVidsBtn.config(text="Fetching videos, please wait...") self.ipGui.update() self.downloadPlaylist() def downloadPlaylist(self): self.startTime = time.time() self.completedVids = [] if not os.path.exists("downloads/playlists"): os.mkdir("downloads/playlists") safePlaylistTitle = self.winStringFormat(self.pafy['title']) if not os.path.exists("downloads/playlists/" + safePlaylistTitle): os.mkdir("downloads/playlists/" + safePlaylistTitle) self.dwnldgVidNum = -1 for vid in self.selectedList: self.totDownloadSize += vid['pafy'].getbest().get_filesize() self.totProgLabel.config( text="Total Progress") for vid in self.selectedList: self.dwnldgVidNum += 1 best = vid['pafy'].getbest() index = self.vidsObjs.index(vid) safeTitle = self.winStringFormat(vid['pafy'].title + "." + best.extension) self.vidDuration = vid['pafy'].duration self.vidTitleLabel.config(text=vid['pafy'].title) best.download(quiet=True, filepath="downloads/playlists/" + safePlaylistTitle + "/" + str( index + 1) + ". " + safeTitle, callback=self.updateProg) self.totProgLabel.config( text="Completed " + str(self.dwnldgVidNum) + " of " + str(len(self.selectedList)) + " videos.") self.completedSize += best.get_filesize() self.completedVids.append(index) tkMessageBox.showinfo("Completed", "Successfully completed download.") self.openDownloadFolder() def updateProg(self, total, recvd, ratio, rate, eta): self.timeNw = time.time() timeDiff = self.timeNw - self.startTime timeTxt = "" if (timeDiff / 3600) > 1: timeTxt += str(int(timeDiff / 3600)) + " : " timeDiff %= 3600 if (timeDiff / 60) > 1: timeTxt += str(int(timeDiff / 60)) + " : " timeDiff %= 60 timeTxt += str(int(timeDiff)) self.thisVidCompletedText.config(text=str(round((recvd / 1024) / 1024, 2)) + " MB") self.thisVidSizeText.config(text=str(round(((total / 1024) / 1024), 2)) + " MB") self.totVidCompletedText.config(text=str(round((((self.completedSize + recvd) / 1024) / 1024), 2)) + " MB") self.totVidSizeText.config(text=str(round(((self.totDownloadSize / 1024) / 1024), 2)) + " MB") self.curSpeedText.config(text=str(round(rate / 1024, 2)) + " mbps") self.vidLengthText.config(text=self.vidDuration) self.etaText.config(text=str(round(eta, 1)) + " secs") self.timeTakenText.config(text=timeTxt) # statusText = "This video: " + str(round((recvd / 1024) / 1024, 2)) + " MB/" + str( # round(((total / 1024) / 1024), 2)) + " MB\tTotal: " + str( # round((((self.completedSize + recvd) / 1024) / 1024), 2)) + " MB/" + str(round(((self.totDownloadSize / 1024) / 1024), 2)) + " MB" # self.indiStat.config(text=statusText) # statusText = "Ratio: " + str(round(rate / 1024, 2)) + " mbps\t\tETA: " + str(round(eta, 1)) + " secs" # self.indiProgLabel.config(text=statusText) self.indiProg.config(value=ratio * 100) self.totProg.config(value=( (float(self.dwnldgVidNum) / len(self.selectedList)) * 100 + ((ratio * 100) / len(self.selectedList)))) self.ipGui.update() def winStringFormat(self, name): return name.replace("|", " ").replace(":", " ").replace("/", " ").replace("\\", " ").replace("$", " ").replace( "#", " ").replace("@", " ").replace(";", " ").replace("\"", " ").replace("'", " ").replace("?", " ") def openDownloadFolder(self): safePlaylistTitle = self.winStringFormat(self.pafy['title']) os.system('explorer.exe "' + os.path.dirname( os.path.abspath(__file__)) + '\\downloads\\playlists\\' + safePlaylistTitle + '"')
class TkSynthWindow(Frame): """ Provides common synth editor elements: bank editor MIDI tab Mapping tabs TkSynthWindow is customized by adding one or more TkSubEditor. """ 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 enable(self, flag): for ed in self._child_editors.values(): ed.enable(flag) if flag: msg = "" else: msg = "Editor locked while in extended mode" self._lab_extended.config(text=msg) def panic(self): self.synth.osc_transmitter.x_all_notes_off() self.status("All notes off") def clear_status(self): self._lab_status.config(text="") def add_child_editor(self, child_name, child): # Adds child editor to list of editors without adding a notebook tab. self._child_editors[child_name] = child def _create_basic_tab(self,text): f = factory.frame(self.notebook) self.notebook.add(f, text=text) return f # icon_filename = "resources/%s/logo_32.png" % sy.specs["format"] # icon = factory.image(icon_filename) # group.notebook.add(swin, text=sy.sid, image=icon, compound="top") def _create_compund_tab(self,text,image_filename): try: icon = factory.image(image_filename) f = factory.frame(self.notebook) self.notebook.add(f,text=text,image=icon,compound="top") return f except IOError: msg = "IOError while loading image file '%s'" % image_filename print(msg) return self._create_basic_tab(text) def create_tab(self, tab_text, image_filename=""): if not image_filename: rs = self._create_basic_tab(tab_text) else: rs = self._create_compund_tab(tab_text,image_filename) return rs def remove_synth(self, *_): sid = self.synth.sid parser = self.app.ls_parser sh = parser.synthhelper sh.destroy_editor(sid) sh.remove_synth(sid, force=True) self.status("Removed synth: %s" % sid) def _init_info_tab(self, master): img = factory.image("resources/Tabs/info.png") frame = factory.frame(master) inner_frame = factory.frame(frame) master.add(frame, text="Info", image=img,compound="top") text_widget = factory.text_widget(inner_frame) text_widget.config(width=120, height=40) vsb = factory.scrollbar(inner_frame, orientation='vertical') vsb.config(command=text_widget.yview) text_widget.config(yscrollcommand=vsb.set, wrap='word',) text_widget.grid(row=0, column=0,sticky="ewns") vsb.grid(row=0, column=1, sticky='ns') inner_frame.grid(row=0, column=0, rowspan=8, columnspan=8, sticky="ewns") self._info_text_widget = text_widget def lift_window(self): mw = self.app.main_window() grp = mw.group_windows[self.group_index] grp.lift() self.status("Lift window") def lower_window(self): mw = self.app.main_window() grp = mw.group_windows[self.group_index] grp.lower() self.status("Lower window") def sync_program_tab(self): bnk = self.synth.bank() prog = bnk[None] slot = bnk.current_slot pp = self.synth.specs["pretty-printer"] if pp: txt = pp(prog, slot) else: txt = "" self._info_text_widget.delete(1.0, "end") self._info_text_widget.insert("end", txt) def _init_midi_tab(self, master): img = factory.image("resources/Tabs/midi.png") frame = factory.frame(master) master.add(frame, text = "Performance", image=img, compound="top") frame_channel = factory.frame(frame) frame_keytab = factory.frame(frame) lab_transpose = factory.label(frame, "Transpose") lab_keyrange = factory.label(frame, "Key Range") lab_bend = factory.label(frame, "Bend Range") self.list_channel = factory.listbox(frame_channel) sb_channel = factory.scrollbar(frame_channel) sb_channel.config(command=self.list_channel.yview) self.list_channel.config(yscrollcommand=sb_channel.set) self.list_keytab = factory.listbox(frame_keytab) sb_keytab = factory.scrollbar(frame_keytab) sb_keytab.config(command=self.list_keytab.yview) self.list_keytab.config(yscrollcommand=sb_keytab.set) spin_transpose = factory.int_spinbox(frame,self.var_transpose,-36,36) spin_keylow = factory.int_spinbox(frame,self.var_keyrange_low,0,127) spin_keyhigh = factory.int_spinbox(frame,self.var_keyrange_high,0,127) spin_bendrange = factory.int_spinbox(frame,self.var_bendrange, 0, 2400) factory.padding_label(frame).grid(row=0) lab_channel = factory.label(frame,"MIDI Input Channel") lab_channel.grid(row=0,column=0,columnspan=2, pady=8) frame_channel.grid(row=1, column=0, rowspan=4, columnspan=2,padx=8,pady=8) self.list_channel.pack(side="left", expand=True, fill="both") sb_channel.pack(after=self.list_channel, side="right", expand=True, fill="y") lab_ktab = factory.label(frame, "Key Table") lab_ktab.grid(row=0,column=2,columnspan=2,pady=8) frame_keytab.grid(row=1, column=2, rowspan=4, columnspan=2,padx=8,pady=8) self.list_keytab.pack(side="left", expand=True, fill="both") sb_keytab.pack(after=self.list_keytab, side="right", expand=True, fill="y") factory.padding_label(frame).grid(row=6) lab_transpose.grid(row=7, column=0, sticky="w", padx=4, pady=4) lab_keyrange.grid(row=8, column=0, sticky="w", padx=4, pady=4) lab_bend.grid(row=9, column=0, sticky="w", padx=4, pady=4) spin_transpose.grid(row=7, column=1, padx=4) spin_keylow.grid(row=8, column=1, padx=4) spin_keyhigh.grid(row=8, column=2, padx=4) spin_bendrange.grid(row=9, column=1, padx=4) def channel_callback(_): i = self.list_channel.curselection()[0] c = i+1 self.synth.midi_input_channel(c) self.status("MIDI Input Channel = %s" % c) def keytab_callback(_): i = self.list_keytab.curselection()[0] kt = self.list_keytab.get(i) self.synth.keytable(kt) self.status("Using keytable: %s" % kt) def transpose_callback(*_): try: x = int(self.var_transpose.get()) self.synth.transpose(x) self.status("Transpose = %s" % x) except ValueError: self.warning("Invalid transpose") def keyrange_callback(*_): try: a = int(self.var_keyrange_low.get()) b = int(self.var_keyrange_high.get()) a, b = min(a,b), max(a,b) self.synth.key_range((a,b)) self.status("Key range = [%3d, %3d]" % (a, b)) except ValueError: self.warning("Invalid keyrange") def bend_callback(*_): try: b = int(self.var_bendrange.get()) self.synth.bend_range(b) self.status("Bend range = %s" % b) except ValueError: self.warning("Invalid Bendrange") self.list_channel.bind("<<ListboxSelect>>", channel_callback) self.list_keytab.bind("<<ListboxSelect>>", keytab_callback) spin_transpose.config(command=transpose_callback) spin_transpose.bind("<Return>", transpose_callback) spin_keylow.config(command=keyrange_callback) spin_keylow.bind("<Return>", keyrange_callback) spin_keyhigh.config(command=keyrange_callback) spin_keyhigh.bind("<Return>", keyrange_callback) spin_bendrange.config(command=bend_callback) spin_bendrange.bind("<Return>", bend_callback) def sync_midi_tab(self): self.list_channel.delete(0, "end") for c in self.app.config().channel_assignments.formatted_list(): self.list_channel.insert("end", c) mic = self.synth.midi_input_channel()-1 self.list_channel.selection_set(mic) self.list_keytab.delete(0, "end") target, index = self.synth.keytable(), 0 for i, kt in enumerate(sorted(self.app.keytables.keys())): self.list_keytab.insert("end", kt) if target == kt: index = i self.list_keytab.selection_set(index) self.var_transpose.set(self.synth.transpose()) lo, hi = self.synth.key_range() self.var_keyrange_low.set(lo) self.var_keyrange_high.set(hi) self.var_bendrange.set(self.synth.bend_range()) # map1_tab -> MIDI controller, pitch wheel def _init_map1_tab(self, master): img = factory.image("resources/Tabs/map.png") HELP_TOPIC = "parameter-maps" frame = factory.frame(master) master.add(frame, text="Map1", image=img, compound="top") north = factory.label_frame(frame, "MIDI Controller Maps") south = factory.label_frame(frame, "Pitch Wheel Maps") north.grid(row=0, column=0, sticky="ew", padx=8, pady=8) south.grid(row=1, column=0, sticky="ew", padx=8, pady=8) def help_callback(): self.app.main_window().display_help(HELP_TOPIC) list_cc_maps = factory.listbox(north, ttip="Active MIDI controller maps") list_cc_maps.config(width=80, height=16) self.list_cc_maps = list_cc_maps sb = factory.scrollbar(north, orientation="vertical") sb.config(command=list_cc_maps.yview) list_cc_maps.config(yscrollcommand=sb.set) b_add_cc = factory.add_button(north, ttip="Add new controller map") b_delete_cc = factory.delete_button(north, ttip="Delete controller map") list_cc_maps.grid(row=0, column=0, rowspan=4, columnspan=8, sticky="ew") sb.grid(row=0, column=8, rowspan=4, sticky="ns") b_add_cc.grid(row=4, column=0, sticky="ew") b_delete_cc.grid(row=4, column=1, sticky="ew") list_pwheel_maps = factory.listbox(south, ttip="Active pitch wheel maps") list_pwheel_maps.config(width=80, height=8) self.list_pwheel_maps = list_pwheel_maps sb = factory.scrollbar(south, orientation="vertical") sb.config(command=list_pwheel_maps.yview) list_pwheel_maps.config(yscrollcommand=sb.set) b_add_pw = factory.add_button(south, ttip="Add pitchwheel map") b_delete_pw = factory.delete_button(south, ttip="Delete pitchwheel map") b_help = factory.help_button(south, command=help_callback) list_pwheel_maps.grid(row=0, column=0, rowspan=4, columnspan=8, sticky="ew") sb.grid(row=0, column=8, rowspan=4, sticky="ns") b_add_pw.grid(row=4, column=0, sticky="ew") b_delete_pw.grid(row=4, column=1, sticky="ew") b_help.grid(row=4, column=7, sticky="ew") def add_cc_callback(): dialog = add_map_dialog(self.synth, "cc", self.app) def delete_cc_callback(): dialog = delete_map_dialog(self, self.synth, "cc", self.app) def add_pw_callback(): dialog = add_map_dialog(self.synth, "PitchWheel", self.app) def delete_pw_callback(): dialog = delete_map_dialog(self, self.synth, "PitchWheel", self.app) b_add_cc.config(command=add_cc_callback) b_delete_cc.config(command=delete_cc_callback) b_add_pw.config(command=add_pw_callback) b_delete_pw.config(command=delete_pw_callback) def sync_map1_tab(self): perf = self.synth.bank()[None].performance cmaps = perf.controller_maps pwmaps = perf.pitchwheel_maps self.list_cc_maps.delete(0, "end") for ctrl, mapper in cmaps.items(): s = str(mapper) for q in s.split('\n'): self.list_cc_maps.insert("end", q) self.list_pwheel_maps.delete(0, "end") for q in str(pwmaps).split('\n'): self.list_pwheel_maps.insert("end", q) def _init_map2_tab(self, master): img = factory.image("resources/Tabs/map.png") HELP_TOPIC = "parameter-maps" HEIGHT = 8 frame = factory.frame(master) master.add(frame, text="Map2",image=img,compound="top") north = factory.label_frame(frame, "Velocity Maps") center = factory.label_frame(frame, "Aftertouch Maps") south = factory.label_frame(frame, "Keynumber Maps") north.grid(row=0, column=0, sticky="ew", padx=8, pady=8) center.grid(row=1, column=0, sticky="ew", padx=8) south.grid(row=2, column=0, sticky="ew", padx=8, pady=8) def help_callback(): self.app.main_window().display_help(HELP_TOPIC) list_vel_maps = factory.listbox(north, ttip="Active velocity maps") list_vel_maps.config(width=80, height=HEIGHT) self.list_vel_maps = list_vel_maps sb = factory.scrollbar(north, orientation="vertical") sb.config(command=list_vel_maps.yview) list_vel_maps.config(yscrollcommand=sb.set) b_add_vel = factory.add_button(north, ttip="Add velocity map") b_delete_vel = factory.delete_button(north, ttip="Delete velocity map") list_vel_maps.grid(row=0, column=0, columnspan=8, sticky="ew") sb.grid(row=0, column=8, sticky="ns") b_add_vel.grid(row=1, column=0, sticky="ew") b_delete_vel.grid(row=1, column=1, sticky="ew") list_atouch_maps = factory.listbox(center, ttip="Active after touch maps") list_atouch_maps.config(width=80, height=HEIGHT) self.list_atouch_maps = list_atouch_maps sb = factory.scrollbar(center, orientation="vertical") sb.config(command=list_atouch_maps.yview) list_atouch_maps.config(yscrollcommand=sb.set) b_add_atouch = factory.add_button(center, ttip="Add after touch map") b_delete_atouch = factory.delete_button(center, ttip="Delete after touch map") list_atouch_maps.grid(row=0, column=0, columnspan=8, sticky="ew") sb.grid(row=0, column=8, sticky="ns") b_add_atouch.grid(row=1, column=0, sticky="ew") b_delete_atouch.grid(row=1, column=1, sticky="ew") list_keynum_maps = factory.listbox(south, ttip="Active key number maps") list_keynum_maps.config(width=80, height=HEIGHT) self.list_keynum_maps = list_keynum_maps sb = factory.scrollbar(south, orientation="vertical") sb.config(command=list_keynum_maps.yview) list_keynum_maps.config(yscrollcommand=sb.set) b_add_keynum = factory.add_button(south, ttip="Add key number map") b_delete_keynum = factory.delete_button(south, ttip="Delete key number map") b_help = factory.help_button(south, command=help_callback) list_keynum_maps.grid(row=0, column=0, columnspan=8, sticky="ew") sb.grid(row=0, column=8, sticky="ns") b_add_keynum.grid(row=1, column=0, sticky="ew") b_delete_keynum.grid(row=1, column=1, sticky="ew") b_help.grid(row=1, column=7, sticky="ew") def add_map_callback(event): widget = event.widget if widget is b_add_vel: dialog = add_map_dialog(self.synth, "velocity", self.app) elif widget is b_add_atouch: dialog = add_map_dialog(self.synth, "aftertouch", self.app) elif widget is b_add_keynum: dialog = add_map_dialog(self.synth, "keynumber", self.app) else: msg = "Invalid widget - Should never see this" raise ValueError(msg) def delete_map_callback(event): widget = event.widget if widget is b_delete_vel: dialog = delete_map_dialog(self, self.synth, "velocity", self.app) elif widget is b_delete_atouch: dialog = delete_map_dialog(self, self.synth, "aftertouch", self.app) elif widget is b_delete_keynum: dialog = delete_map_dialog(self, self.synth, "keynumber", self.app) else: msg = "Invalid widget - Should never see this" raise ValueError(msg) b_add_vel.bind("<Button-1>", add_map_callback) b_add_atouch.bind("<Button-1>", add_map_callback) b_add_keynum.bind("<Button-1>", add_map_callback) b_delete_vel.bind("<Button-1>", delete_map_callback) b_delete_atouch.bind("<Button-1>", delete_map_callback) b_delete_keynum.bind("<Button-1>", delete_map_callback) def sync_map2_tab(self): perf = self.synth.bank()[None].performance vmaps = perf.velocity_maps atmaps = perf.aftertouch_maps knmaps = perf.keynumber_maps self.list_vel_maps.delete(0, 'end') self.list_atouch_maps.delete(0, 'end') self.list_keynum_maps.delete(0, 'end') for q in str(vmaps).split('\n'): self.list_vel_maps.insert('end', q) for q in str(atmaps).split('\n'): self.list_atouch_maps.insert('end', q) for q in str(knmaps).split('\n'): self.list_keynum_maps.insert('end', q) def status(self, msg): self._lab_status.config(text = msg) def warning(self, msg): msg = "WARNING: %s" % msg self._lab_status.config(text = msg) def set_value(self, param, value): for ed in self._child_editors.items(): ed.set_value(param, value) def set_aspect(self, param, value): for ed in self._child_editors.values(): ed.set_value(param, value) def sync(self, *ignore): self.sync_program_tab() self.sync_midi_tab() self.sync_map1_tab() self.sync_map2_tab() if "bank" not in ignore: self.bank_editor.sync_no_propegate() for key, ed in self._child_editors.items(): if key not in ignore: ed.sync(*ignore) def annotation_keys(self): """ See TkSubEditor annotation """ acc = [] for ed in self._child_editors.values(): acc += ed.annotation_keys() return acc def set_annotation(self, key, text): """ See TkSubEditor annotation """ for ed in self._child_editors.values(): ed.annotation(key, text) def get_annotation(self, key): """ See TkSubEditor annotation """ rs = None for ed in self._child_editors.values(): rs = ed.get_annotation(key) if rs != None: return rs return None def update_progressbar(self, count, value): """ Set progress bar to position value/count, where. count - Expected number of steps. value - Current step number. """ self._progressbar.config(mode="determinate", maximum=count) self._progressbar.step() self.update_idletasks() def busy(self, flag, message=""): """ Set progress bar to 'busy' """ 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.update_idletasks()