def create_input_graph(self, parent, sizer): """ Creates a graph that plots the input It returns a timer what starts the plotting """ graph_panel = wx.Panel(parent, size=(320,0)) self.input_data_generator = DataGen(self) self.data_input = [] dpi = 160 fig = Figure((2.0, 1.0), dpi=dpi) self.axes_input = fig.add_subplot(111) fig.add_subplot() fig.subplots_adjust(bottom=0.009,left=0.003,right=0.997, top=0.991) self.axes_input.set_axis_bgcolor('black') pylab.setp(self.axes_input.get_xticklabels(), fontsize=4) pylab.setp(self.axes_input.get_yticklabels(), fontsize=4) self.plot_data_input = self.axes_input.plot(self.data_input, linewidth=1, color=(1, 0, 0), )[0] self.axes_input.grid(True, color='gray') self.canvas_input = FigCanvas(graph_panel, -1, fig) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.canvas_input, 0) graph_panel.SetSizer(vbox) sizer.Add(graph_panel, 0, wx.TOP | wx.BOTTOM, 5) self.axes_input.set_xbound(lower=0, upper=100) self.axes_input.set_ybound(lower=-1.0, upper=1.0) redraw_timer_input = MyThread(self.graph_refresh_time, self.on_redraw_graph, self) #wx.Timer(self) return redraw_timer_input
class main_window(wx.Frame): """ Main Window Modes: (Regular Mode, Preset Editing Mode, Preset Mode) """ def __init__(self, *args, **kwargs): super(main_window, self).__init__(*args, **kwargs) self.InitUI() def InitUI(self): """ Initialize the main screen on Regular Mode. """ # Creates the menu with two items: File and Preset self.Bind(wx.EVT_CLOSE, self.OnQuit) self.menubar = wx.MenuBar() self.menu = wx.Menu() item_novo = self.menu.Append(wx.ID_NEW, "New Preset", "Create new preset") item_carregar = self.menu.Append(wx.ID_OPEN, "Load Preset", "Load preset") item_salvar = self.menu.Append(wx.ID_SAVE, "Save Preset", "Save preset") item_sair = self.menu.Append(wx.ID_EXIT, "Quit", "Quit") self.menubar.Append(self.menu , 'File') self.menu_preset = wx.Menu() item_voltar = self.menu_preset.Append(wx.ID_BACKWARD, "Back", "Back") item_editar = self.menu_preset.Append(wx.ID_EDIT, "Edit Preset", "Edit Preset") item_start = self.menu_preset.Append(wx.ID_SETUP, "Play Preset", "Play Preset") self.menubar.Append(self.menu_preset , 'Preset') self.SetMenuBar(self.menubar) self.menubar.EnableTop(1, False) self.Bind(wx.EVT_MENU, self.OnNewPreset, item_novo) self.Bind(wx.EVT_MENU, self.OnLoadPreset, item_carregar) self.Bind(wx.EVT_MENU, self.OnQuit, item_sair) self.Bind(wx.EVT_MENU, self.OnEditPreset, item_editar) self.Bind(wx.EVT_MENU, self.OnSavePreset, item_salvar) self.Bind(wx.EVT_MENU, self.OnStartPreset, item_start) self.Bind(wx.EVT_MENU, self.OnVoltar, item_voltar) # --------------------- # # STATUS VARIABLES # # -------------------- # # Player status: 0-Stopped, 1-Playing, 2-Paused self.status = 0 # Preset use status: 0-not using, 1-Playing preset, 2-Editing preset self.preset_mode = 0 # Graph refresh time in ms self.graph_refresh_time = 100 self.pausa_grafico = False # Creates the panel and the main sizer self.panel_principal = wx.ScrolledWindow(self,-1) self.panel_principal.SetScrollbars(1,1,1,1) self.panel_principal.SetBackgroundColour("#444444") self.sizer_principal = wx.BoxSizer(wx.HORIZONTAL) self.panel_principal.SetSizer(self.sizer_principal) # Left Panel/Sizer (filters/playing preset) self.panel_esquerda = wx.Panel(self.panel_principal) self.panel_esquerda.SetBackgroundColour('#444444') self.sizer_esquerda = wx.BoxSizer(wx.VERTICAL) self.panel_esquerda.SetSizer(self.sizer_esquerda) self.sizer_principal.Add(self.panel_esquerda, 1, wx.EXPAND | wx.ALL, 25) # ------------------ # # RIGHT PANEL # # ----------------- # # Right Panel/Sizer (graph/buttons/preset editing) self.panel_direita = wx.Panel(self.panel_principal,size=(320,0)) self.panel_direita.SetBackgroundColour('#333333') self.sizer_direita = wx.BoxSizer(wx.VERTICAL) self.panel_direita.SetSizer(self.sizer_direita) self.sizer_principal.Add(self.panel_direita, 0, wx.EXPAND | wx.ALL, 0) # Creates the buttons play/pause/stop/next/previous self.toolbar = wx.ToolBar(self.panel_direita, style=wx.NO_BORDER) self.toolbar.SetMinSize((320,65)) self.sizer_direita.Add(self.toolbar, 0, wx.EXPAND | wx.BOTTOM, 5) self.toolbar.AddSeparator() self.toolbar.AddSeparator() self.toolbar.AddSeparator() self.toolbar.AddSeparator() self.toolbar.AddSeparator() self.toolbar.AddSeparator() previous = self.toolbar.AddLabelTool(wx.ID_PREVIEW_PREVIOUS,'Previous', wx.Bitmap('images/previous.png')) stop = self.toolbar.AddLabelTool(wx.ID_STOP,'Stop', wx.Bitmap('images/stop.png')) play = self.toolbar.AddLabelTool(wx.ID_UP,'Play/Pause', wx.Bitmap('images/play.png')) nextt = self.toolbar.AddLabelTool(wx.ID_PREVIEW_NEXT,'Next', wx.Bitmap('images/next.png')) self.toolbar.Realize() self.Bind(wx.EVT_TOOL, self.OnPlayPause, play) self.Bind(wx.EVT_TOOL, self.OnStop, stop) self.Bind(wx.EVT_TOOL, self.OnPrevious, previous) self.Bind(wx.EVT_TOOL, self.OnNext, nextt) line = wx.StaticLine(self.panel_direita, size=(320,2), style=wx.LI_HORIZONTAL) self.sizer_direita.Add(line,0,border=0) self.desenha_graficos() # Filter's variables # A tuple composed of 3 lists: (checkbuttons, edit buttons, filters) self.filters = ([],[],[]) # Applied filters (Regular Mode) self.filtros_aplicados = [] # Instance of the Player class (player.py) self.player = None # Serial reading variable self.pedal = None # Preset = list of list of filters self.preset = [] # List (ListBox) with the edited preset self.list_edit_filters = None # Position in the preset self.posicao_preset = 0 self.filter_default_list(self.panel_esquerda, self.sizer_esquerda) self.modo_tocando() self.Show(True) self.Maximize() """ Functions containing all the gui modes: Regular Mode, Preset Editing Mode and Preset Mode """ def modo_tocando(self): """ Set the window to the Regular Mode """ self.posicao_preset = 0 if self.player is not None and not self.player.player.finished: self.player.pausar() if self.list_edit_filters is not None: self.list_edit_filters.Destroy() self.list_edit_filters = None for i in range(len(self.filters[0])): self.filters[0][i].SetValue(False) self.filters[1][i].Enable(True) self.filtros_aplicados = [] self.status = 0 self.preset_mode = 0 self.preset = [] self.menu.Enable(wx.ID_NEW, 1) self.menu.Enable(wx.ID_OPEN, 1) self.menu.Enable(wx.ID_SAVE, 0) self.menubar.EnableTop(1, False) self.botoes_pause() if self.pedal is None: self.pedal = sc.SerialData(func_proximo=lambda: self.OnNext(None), func_anterior=lambda: self.OnPrevious(None)) self.pedal.start() filters.pedal = self.pedal.pedal def modo_edita_preset(self): """ Set the window to the Preset Editing Mode """ self.posicao_preset = 0 self.status = 0 if self.player is not None and not self.player.player.finished: self.data_input = [] self.data_output = [] self.on_redraw_graph(None) self.player.pausar() if self.list_edit_filters is not None: self.list_edit_filters.Destroy() self.list_edit_filters = None if len(self.filters[0]) == 0: self.sizer_esquerda.Remove(self.panel_preset) self.panel_preset.Destroy() self.filter_default_list(self.panel_esquerda, self.sizer_esquerda) self.filtros_aplicados = [] self.preset_mode = 2 self.menu.Enable(wx.ID_NEW, 1) self.menu.Enable(wx.ID_OPEN, 1) self.menubar.EnableTop(1, True) self.menu.Enable(wx.ID_SAVE, True) self.menu_preset.Enable(wx.ID_SETUP, True) self.menu_preset.Enable(wx.ID_EDIT, False) self.botoes_pause() self.data_input = [] self.data_output = [] def modo_tocando_preset(self): """ Set the window to the Preset Mode """ self.posicao_preset = 0 if self.player is not None and not self.player.player.finished: self.player.pausar() if self.list_edit_filters is not None: self.list_edit_filters.Destroy() self.list_edit_filters = None self.filtros_aplicados = [] self.status = 0 self.preset_mode = 1 self.menu.Enable(wx.ID_NEW, 1) self.menu.Enable(wx.ID_OPEN, 1) self.menubar.EnableTop(1, True) self.menu.Enable(wx.ID_SAVE, False) self.menu_preset.Enable(wx.ID_SETUP, False) self.menu_preset.Enable(wx.ID_EDIT, True) self.botoes_pause() """ Functions to handle the events of mode change """ def OnNewPreset(self, e): """ Creates a new preset """ self.pausa_grafico = True if self.preset_mode == 1 and self.status == 1: filters.pedal = ControlStream(0.1) self.pedal.kill() self.modo_edita_preset() self.preset = [[]] self.filter_list_box(self.panel_direita, self.sizer_direita, self.preset) self.list_edit_filters.SetSelection(0) self.mostra_lista_filtro([]) try: self.timer_graph.stop() self.panel_graficos.Destroy() self.panel_graficos = None except: pass self.panel_direita.Fit() self.panel_direita.Layout() self.Layout() self.panel_direita.Update() self.panel_direita.Update() self.sizer_direita.Layout() def OnSavePreset(self, e): """ Saves the opened preset into a file """ openFileDialog = wx.FileDialog(self, "Type the file's name to save your preset", "", "", "Preset's File (*.preset)|*.preset", wx.FD_SAVE) if openFileDialog.ShowModal() == wx.ID_CANCEL: return data.save_preset(openFileDialog.GetPath(), self.preset) def OnLoadPreset(self, e): """ Loads a preset to edit """ openFileDialog = wx.FileDialog(self, "Type the file's name to load your preset", "", "", "Preset's File (*.preset)|*.preset", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) if openFileDialog.ShowModal() == wx.ID_CANCEL: return self.preset = data.load_preset(openFileDialog.GetPath()) if self.preset_mode == 1 and self.status == 1: filters.pedal = ControlStream(0.1) self.pedal.kill() self.OnEditPreset(None) def OnStartPreset(self ,e): """ Starts playing a preset """ self.posicao_preset = 0 self.filters = ([],[],[]) self.filtros_aplicados = [] self.sizer_esquerda.Remove(self.panel_filtros) self.panel_filtros.Destroy() self.panel_filtros = None self.modo_tocando_preset() self.panel_preset = wx.Panel(self.panel_esquerda) self.sizer_esquerda.Add(self.panel_preset, 1, wx.EXPAND) self.lista_preset = wx.ListCtrl(self.panel_preset,style=wx.LC_REPORT) temp_sizer = wx.BoxSizer(wx.VERTICAL) self.panel_preset.SetSizer(temp_sizer) self.panel_preset.SetBackgroundColour("#880000") self.lista_preset.InsertColumn(0, "Filtros") temp_sizer.Add(self.lista_preset,1,wx.EXPAND) self.panel_esquerda.Fit() self.sizer_principal.Layout() for item in self.preset[0]: self.lista_preset.InsertStringItem(sys.maxint, item.name) self.lista_preset.SetColumnWidth(0, self.lista_preset.GetSize()[0]-5) if self.pedal is None: self.pedal = sc.SerialData(func_proximo=lambda: self.OnNext(None), func_anterior=lambda: self.OnPrevious(None)) self.pedal.start() filters.pedal = self.pedal.pedal self.desenha_graficos() self.panel_direita.Update() self.panel_direita.Fit() self.panel_direita.Layout() self.panel_graficos.Fit() self.panel_graficos.Layout() self.panel_graficos.Update() self.sizer_graficos.Layout() self.Layout() self.panel_direita.Update() self.sizer_direita.Layout() self.sizer_principal.Layout() def OnEditPreset(self, e): """ Edits a playing preset """ self.pausa_grafico = True if self.preset_mode == 1 and self.status == 1: filters.pedal = ControlStream(0.1) self.pedal.kill() self.posicao_preset = 0 self.modo_edita_preset() self.filter_list_box(self.panel_direita, self.sizer_direita, self.preset) self.list_edit_filters.SetSelection(0) self.mostra_lista_filtro(self.preset[0]) try: self.timer_graph.stop() self.panel_graficos.Destroy() self.panel_graficos = None except: pass self.panel_direita.Fit() self.panel_direita.Layout() self.Layout() self.panel_direita.Update() self.sizer_direita.Layout() def OnVoltar(self, e): """ Goes to Regular Mode (quiting either Preset Editing Mode or Preset Mode) """ self.posicao_preset = 0 if self.preset_mode == 1: # Regular Mode if self.status == 1: filters.pedal = ControlStream(0.1) self.pedal.kill() self.sizer_esquerda.Remove(self.panel_preset) self.panel_preset.Destroy() self.filter_default_list(self.panel_esquerda,self.sizer_esquerda) self.panel_esquerda.Fit() self.sizer_principal.Layout() self.panel_direita.Fit() self.panel_direita.Layout() self.Layout() self.panel_direita.Update() self.panel_direita.Update() self.sizer_direita.Layout() self.modo_tocando() if self.preset_mode == 2: # Preset Editing Mode self.modo_tocando() self.desenha_graficos() self.panel_direita.Update() self.panel_direita.Fit() self.panel_direita.Layout() self.panel_graficos.Fit() self.panel_graficos.Layout() self.panel_graficos.Update() self.sizer_graficos.Layout() self.Layout() self.panel_direita.Update() self.sizer_direita.Layout() self.sizer_principal.Layout() """ Functions to set the buttons (play/pause) And to manage its events (play, pause, stop, next, previous) """ def botoes_pause(self): """ Set the buttons (Play/Pause/Stop/Next/Previous) to the paused state (it depends on the preset_mode variable) """ if self.preset_mode == 0: self.toolbar.EnableTool(wx.ID_UP,True) self.toolbar.EnableTool(wx.ID_STOP,True) self.toolbar.EnableTool(wx.ID_PREVIEW_PREVIOUS,False) self.toolbar.EnableTool(wx.ID_PREVIEW_NEXT,False) if self.preset_mode == 1: self.toolbar.EnableTool(wx.ID_UP,True) self.toolbar.EnableTool(wx.ID_STOP,True) self.toolbar.EnableTool(wx.ID_PREVIEW_PREVIOUS,True) self.toolbar.EnableTool(wx.ID_PREVIEW_NEXT,True) if self.preset_mode == 2: self.toolbar.EnableTool(wx.ID_PREVIEW_PREVIOUS, True) self.toolbar.EnableTool(wx.ID_PREVIEW_NEXT, True) self.toolbar.EnableTool(wx.ID_UP, True) self.toolbar.EnableTool(wx.ID_STOP,False) self.toolbar.SetToolNormalBitmap(wx.ID_UP ,wx.Bitmap('images/play.png')) def botoes_play(self): """ Set the buttons(Play/Pause/Stop/Next/Previous) to the playing state """ if self.preset_mode == 0: self.toolbar.EnableTool(wx.ID_PREVIEW_PREVIOUS, False) self.toolbar.EnableTool(wx.ID_PREVIEW_NEXT, False) if self.preset_mode == 1: self.toolbar.EnableTool(wx.ID_PREVIEW_PREVIOUS, True) self.toolbar.EnableTool(wx.ID_PREVIEW_NEXT, True) self.toolbar.EnableTool(wx.ID_STOP, True) self.toolbar.EnableTool(wx.ID_UP,True) self.toolbar.SetToolNormalBitmap(wx.ID_UP ,wx.Bitmap('images/pause.png')) def OnPlayPause (self, e): """ Event to play or pause """ if self.preset_mode == 0: # Playing WITHOUT preset if self.status == 0: # Start playing self.player = player.Player(self.filtros_aplicados) self.botoes_play() self.status = 1 self.timer_graph.start() elif self.status == 1: # Pause self.timer_graph.stop() self.player.pausar() self.botoes_pause() self.status = 2 else: # Resume self.player.tocar(self.filtros_aplicados) self.botoes_play() self.status = 1 self.timer_graph.start() if self.preset_mode == 1: # Playing WITH preset if self.status == 0: # Start playing self.player = player.Player(self.preset[self.posicao_preset]) self.botoes_play() self.status = 1 self.timer_graph.start() elif self.status == 1: # Pause self.timer_graph.stop() self.player.pausar() self.botoes_pause() self.status = 2 else: # Resume self.player.tocar(self.preset[self.posicao_preset]) self.botoes_play() self.status = 1 self.timer_graph.start() if self.preset_mode == 2: # Preset Editing Mode (Start playing) self.OnStartPreset(None) self.OnPlayPause(None) def OnStop (self, e): """ Stop event """ if self.preset_mode == 0: # Regular Mode self.data_input = [] self.data_output = [] self.status = 0 if self.player is not None: self.player.pausar() self.botoes_pause() if self.preset_mode == 1: # Playing Preset self.data_input = [] self.data_output = [] self.status = 0 if self.player is not None: self.player.pausar() self.botoes_pause() self.posicao_preset = 0 self.lista_preset.DeleteAllItems() for filt in self.preset[self.posicao_preset]: self.lista_preset.InsertStringItem(sys.maxint, filt.name) self.on_redraw_graph(None) def OnNext (self, e): """ Changes the preset's position to the next position """ if self.preset_mode == 1: # Playing self.posicao_preset+=1 if self.posicao_preset >= len(self.preset): self.posicao_preset = 0 self.lista_preset.DeleteAllItems() for filt in self.preset[self.posicao_preset]: self.lista_preset.InsertStringItem(sys.maxint, filt.name) if self.status != 1: return self.pausa_grafico = True self.player.muda_filtro(self.preset[self.posicao_preset], self) self.pausa_grafico = False elif self.preset_mode == 2: # Editing atual = int(self.list_edit_filters.GetItems()[int(self.list_edit_filters.GetSelection())]) atual+=1 if atual >= len(self.list_edit_filters.GetItems()): self.list_edit_filters.Append(str(atual)) self.preset.append([]) self.list_edit_filters.SetSelection(atual) self.mostra_lista_filtro(self.get_edit_list_selection()) def OnPrevious (self, e): """ Changes the preset's position to the previous position """ if self.preset_mode == 1: #Playing self.posicao_preset-=1 if self.posicao_preset < 0: self.posicao_preset = len(self.preset)-1 self.lista_preset.DeleteAllItems() for filt in self.preset[self.posicao_preset]: self.lista_preset.InsertStringItem(sys.maxint, filt.name) if self.status != 1: return self.pausa_grafico = True self.player.muda_filtro(self.preset[self.posicao_preset], self) self.pausa_grafico = False elif self.preset_mode == 2: #Editing atual = int(self.list_edit_filters.GetItems()[int(self.list_edit_filters.GetSelection())]) atual-=1 if atual < 0: return self.list_edit_filters.SetSelection(atual) self.mostra_lista_filtro(self.get_edit_list_selection()) """ Functions that manage the filter's editing Both on Preset Editing Mode and Regular Mode """ def filter_list_box (self, parent, sizer, preset): """ Creates a ListBox to edit the preset """ self.list_edit_filters = wx.ListBox(parent, -1, size=(320,400)) sizer.Add(self.list_edit_filters, 0) self.toolbar.Realize() self.Bind(wx.EVT_LISTBOX, self.OnClick) for i in range(len(preset)): self.list_edit_filters.Append(str(i)) def get_edit_list_selection(self): """ Returns the filters of the current preset's position. """ if self.preset_mode == 2: sel = self.list_edit_filters.GetSelection() lista = [] if sel == wx.NOT_FOUND: self.list_edit_filters.SetSelection(0) sel = 0 else: sel = int(sel) sel = int(self.list_edit_filters.GetItems()[sel]) lista = self.preset[sel] return lista def mostra_lista_filtro(self, lista): """ When on Preset Edigint Mode, it shows the filters in the current position """ for i in range(len(self.filters[0])): self.filters[0][i].SetValue(False) self.filters[1][i].Enable(False) for filtro in lista: for i in range(len(self.filters[0])): if filtro.name == self.filters[2][i].name: self.filters[0][i].SetValue(True) self.filters[1][i].Enable(True) break def OnClick(self, e): """ Click event on the preset's Listbox """ self.mostra_lista_filtro(self.get_edit_list_selection()) def filter_default_list(self, panel, sizer): """ Creates the filters default list with the checkbox and the edit button """ self.panel_filtros = wx.Panel(panel) self.panel_filtros.SetBackgroundColour("#666666") sizer.Add(self.panel_filtros,1, wx.EXPAND) box_esquerda = wx.BoxSizer(wx.VERTICAL) lista_filtros = filters.Filtro.filtros i = 0; for name,funcs in lista_filtros.items(): if i % 2 == 0: panel_de_dois = wx.Panel(self.panel_filtros) panel_de_dois.SetBackgroundColour("#666666") sizer_de_dois = wx.BoxSizer(wx.HORIZONTAL) if i == 0: box_esquerda.Add(panel_de_dois, 1, wx.EXPAND | wx.TOP | wx.BOTTOM, 8) else: box_esquerda.Add(panel_de_dois, 1, wx.EXPAND | wx.BOTTOM, 8) panel_de_dois.SetSizer(sizer_de_dois) panelTemp = wx.Panel(panel_de_dois) panelTemp.SetBackgroundColour("#DDDDDD") if i % 2 == 0: sizer_de_dois.Add(panelTemp, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 8) else: sizer_de_dois.Add(panelTemp, 1, wx.EXPAND | wx.RIGHT, 8) sizer_filtros = wx.BoxSizer(wx.VERTICAL) titulo = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False) label_lista = wx.StaticText(panelTemp, label=name) label_lista.SetFont(titulo) label_lista.SetForegroundColour("#111111") sizer_filtros.Add(label_lista, 0, wx.EXPAND | wx.ALL, 10) panelTemp.SetSizer(sizer_filtros) for func in funcs: filtro = func() panel_um = wx.Panel(panelTemp) sizer_um = wx.BoxSizer(wx.HORIZONTAL) check = wx.CheckBox(panel_um,label=filtro.name) botao = wx.Button(panel_um,label="Edit") sizer_um.Add(check, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 10) sizer_um.Add(botao, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 10) panel_um.SetSizer(sizer_um) check.Bind(wx.EVT_CHECKBOX, self.check_filter) botao.Bind(wx.EVT_BUTTON, self.edit_filter) sizer_filtros.Add(panel_um, 0, wx.EXPAND | wx.ALL, 12) self.filters[0].append(check) self.filters[1].append(botao) self.filters[2].append(filtro) i += 1 data.load_defaults(self.filters[2]) self.panel_filtros.SetSizer(box_esquerda) self.panel_esquerda.Fit() self.sizer_principal.Layout() self.panel_direita.Fit() self.panel_direita.Layout() self.Layout() self.panel_direita.Update() self.panel_direita.Update() self.sizer_direita.Layout() def check_filter(self, e): """ Checkbox filter click event """ obj = e.GetEventObject() ind = self.filters[0].index(obj) if self.preset_mode == 0: if obj.GetValue(): self.filtros_aplicados.append(self.filters[2][ind]) else: self.filtros_aplicados.remove(self.filters[2][ind]) if self.status == 1: self.player.muda_filtro(self.filtros_aplicados, self) elif self.preset_mode == 2: # Editing if obj.GetValue(): novo_filtro = copy.deepcopy(self.filters[2][ind]) self.get_edit_list_selection().append(novo_filtro) self.filters[1][ind].Enable(True) else: tudo = self.get_edit_list_selection() for filtro in tudo: if filtro.name == self.filters[2][ind].name: tudo.remove(filtro) break; self.filters[1][ind].Enable(False) def edit_filter (self, e): """ Open the window to edit the filter's parameters The filter is in the list in the self.filters tuple when preset_mode=1 """ if self.preset_mode == 0: filtro = self.filters[2][self.filters[1].index(e.GetEventObject())] janela = edit_window(self,e.GetEventObject(),filtro,False) janela.ShowModal() janela.Destroy() elif self.preset_mode == 2: filtro = self.filters[2][self.filters[1].index(e.GetEventObject())] for filt in self.get_edit_list_selection(): if filt.name == filtro.name: filtro = filt break janela = edit_window(self,e.GetEventObject(),filtro,True) janela.ShowModal() janela.Destroy() """ Functions to handlde the graphs """ def desenha_graficos(self): titulo = wx.Font(13, wx.DEFAULT, wx.NORMAL, wx.BOLD) self.pausa_grafico = False # Graphs Panel/Sizer self.panel_graficos = wx.Panel(self.panel_direita, size=(320,0)) self.sizer_graficos = wx.BoxSizer(wx.VERTICAL) self.panel_graficos.SetSizer(self.sizer_graficos) # Input txt = wx.StaticText(self.panel_graficos, label=u"Input") txt.SetFont(titulo) txt.SetForegroundColour("#FFFFFF") self.sizer_graficos.Add(txt,0, wx.LEFT, 10) self.timer_graph = self.create_input_graph(self.panel_graficos,self.sizer_graficos) # Output txt2 = wx.StaticText(self.panel_graficos, label=u"Output") txt2.SetFont(titulo) txt2.SetForegroundColour("#FFFFFF") self.sizer_graficos.Add(txt2,0, wx.LEFT, 10) self.timer_graph2 = self.create_output_graph(self.panel_graficos,self.sizer_graficos) self.sizer_direita.Add(self.panel_graficos,0,wx.EXPAND | wx.TOP | wx.BOTTOM, 5) line2 = wx.StaticLine(self.panel_graficos, size=(320,2), style=wx.LI_HORIZONTAL) self.sizer_graficos.Add(line2,0,border=0) # Functions create_input_graph, create_output_graph e on_redraw_graph # Based on http://eli.thegreenplace.net/files/prog_code/wx_mpl_dynamic_graph.py.txt def create_output_graph(self, parent, sizer): """ Creates a graph that plots the output """ graph_panel = wx.Panel(parent, size=(320,0)) self.data_output = [] dpi = 160 fig = Figure((2.0, 1.0), dpi=dpi) self.axes_output = fig.add_subplot(111) fig.add_subplot() fig.subplots_adjust(bottom=0.009,left=0.003,right=0.997, top=0.991) self.axes_output.set_axis_bgcolor('black') pylab.setp(self.axes_output.get_xticklabels(), fontsize=4) pylab.setp(self.axes_output.get_yticklabels(), fontsize=4) self.plot_data_output = self.axes_output.plot(self.data_output, linewidth=1, color=(0, 0, 1), )[0] self.axes_output.grid(True, color='gray') self.canvas_output = FigCanvas(graph_panel, -1, fig) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.canvas_output, 0) graph_panel.SetSizer(vbox) sizer.Add(graph_panel, 0, wx.TOP | wx.BOTTOM, 5) self.axes_output.set_xbound(lower=0, upper=100) self.axes_output.set_ybound(lower=-1.0, upper=1.0) def create_input_graph(self, parent, sizer): """ Creates a graph that plots the input It returns a timer what starts the plotting """ graph_panel = wx.Panel(parent, size=(320,0)) self.input_data_generator = DataGen(self) self.data_input = [] dpi = 160 fig = Figure((2.0, 1.0), dpi=dpi) self.axes_input = fig.add_subplot(111) fig.add_subplot() fig.subplots_adjust(bottom=0.009,left=0.003,right=0.997, top=0.991) self.axes_input.set_axis_bgcolor('black') pylab.setp(self.axes_input.get_xticklabels(), fontsize=4) pylab.setp(self.axes_input.get_yticklabels(), fontsize=4) self.plot_data_input = self.axes_input.plot(self.data_input, linewidth=1, color=(1, 0, 0), )[0] self.axes_input.grid(True, color='gray') self.canvas_input = FigCanvas(graph_panel, -1, fig) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.canvas_input, 0) graph_panel.SetSizer(vbox) sizer.Add(graph_panel, 0, wx.TOP | wx.BOTTOM, 5) self.axes_input.set_xbound(lower=0, upper=100) self.axes_input.set_ybound(lower=-1.0, upper=1.0) redraw_timer_input = MyThread(self.graph_refresh_time, self.on_redraw_graph, self) #wx.Timer(self) return redraw_timer_input def on_redraw_graph(self, event): """ Function that is called by the timer thread to update the graph """ if self.pausa_grafico: return if self.status != 1: self.plot_data_input.set_xdata(np.arange(len(self.data_input))) self.plot_data_input.set_ydata(np.array(self.data_input)) self.plot_data_output.set_xdata(np.arange(len(self.data_output))) self.plot_data_output.set_ydata(np.array(self.data_output)) self.canvas_input.draw() self.canvas_output.draw() self.timer_graph.stop() return tupla = self.input_data_generator.next() if tupla is None: return self.data_input.append(tupla[0]) self.data_output.append(tupla[1]) xmax_in = len(self.data_input) if len(self.data_input) > 100 else 100 xmin_in = xmax_in - 100 size = round(max(abs(max(self.data_input[-100:])),abs(min(self.data_input[-100:])),abs(max(self.data_output[-100:])),abs(min(self.data_output[-100:]))),2) if size == 0.00: size = 1. ymax_in = size*1.1 ymin_in = size*(-1.1) xmax_out = len(self.data_output) if len(self.data_output) > 100 else 100 xmin_out = xmax_out - 100 ymax_out = size*1.1 ymin_out = size*(-1.1) self.axes_input.set_xbound(lower=xmin_in, upper=xmax_in) self.axes_input.set_ybound(lower=ymin_in, upper=ymax_in) self.plot_data_input.set_xdata(np.arange(len(self.data_input))) self.plot_data_input.set_ydata(np.array(self.data_input)) self.axes_output.set_xbound(lower=xmin_out, upper=xmax_out) self.axes_output.set_ybound(lower=ymin_out, upper=ymax_out) self.plot_data_output.set_xdata(np.arange(len(self.data_output))) self.plot_data_output.set_ydata(np.array(self.data_output)) if self.panel_graficos is not None: self.canvas_input.draw() self.canvas_output.draw() def OnQuit(self, e): self.__del__() def __del__(self): """ Kills other threads """ self.status = 0 try: self.OnStop(None) except: pass del self.timer_graph if self.player is not None and not self.player.player.finished: del self.player try: del self.pedal except: pass self.Destroy()