Module pyspecan.controller.tkGUI.plot_base
tkGUI base PlotController
Functions
def args_plot(parser, cfg)-
Expand source code
def args_plot(parser, cfg): parser.add_argument("-rl", "--ref_level", default=cfg.ref_level, type=float, help="ref Level") parser.add_argument("-sd", "--scale_div", default=cfg.scale_div, type=float, help="scale per division") parser.add_argument("-vb", "--vbw", default=cfg.vbw, type=float, help="video bandwidth") parser.add_argument("-w", "--window", default=cfg.window, choices=[k for k in WindowLUT.keys()], help="FFT window function")
Classes
class FreqPlotController (parent,
pane: Panel,
**kwargs)-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmaxController for view.tkGUI frequency-domain plots
Ancestors
- pyspecan.controller.tkGUI.plot_base._PlotController
Subclasses
Instance variables
var lbl_hi-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax var lbl_lo-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax var ref_level-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax var scale-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax var vbw-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax var window-
Expand source code
class FreqPlotController(_PlotController): """Controller for view.tkGUI frequency-domain plots""" __slots__ = ( "window", "vbw", "scale", "ref_level", "lbl_lo", "lbl_hi" ) def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.window = kwargs.get("window", "blackman") self.vbw = kwargs.get("vbw", 10.0) self.scale = kwargs.get("scale_div", 10.0) self.ref_level = kwargs.get("ref_level", 0.0) self.draw_settings() self.set_ref_level(self.pane.sets["ref_level"].get()) self.lbl_lo = ttk.Label(self.pane.fr_main, text="V") self.lbl_hi = ttk.Label(self.pane.fr_main, text="^") self.lbl_lo.lift() self.lbl_hi.lift() def update(self): self.plotter.canvas.draw() def update_f(self, f): """Set plot xticks and xlabels""" def update_nfft(self, nfft): """Update plot nfft""" def _plot(self, samps): # type: ignore raise NotImplementedError() def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) @property def y_top(self): """Return plot maximum amplitude""" return self.ref_level @property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale) def _show_y_location(self, psd): if np.all(psd < self.y_btm): self.lbl_lo.place(relx=0.2, rely=0.9, width=20, height=20) else: if self.lbl_lo.winfo_ismapped(): self.lbl_lo.place_forget() if np.all(psd > self.y_top): self.lbl_hi.place(relx=0.2, rely=0.1, width=20, height=20) else: if self.lbl_hi.winfo_ismapped(): self.lbl_hi.place_forget() def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return row # --- GUI bind events and setters --- # def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale)) def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level)) def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw)) def set_window(self, window): """Set plot window function""" self.window = window def _calc_ref_level(self, psd, mul=0.1): pmax = np.max(psd) pmax = int(pmax * (1-mul)) if pmax < 0 else int(pmax * (1+mul)) return pmax prop y_btm-
Expand source code
@property def y_btm(self): """Return plot minimum amplitude""" return self.ref_level - (10*self.scale)Return plot minimum amplitude
prop y_top-
Expand source code
@property def y_top(self): """Return plot maximum amplitude""" return self.ref_levelReturn plot maximum amplitude
Methods
def draw_settings(self, row=0)-
Expand source code
def draw_settings(self, row=0): var_scale = tk.StringVar(self.pane.settings, str(self.scale)) ent_scale = ttk.Entry(self.pane.settings, textvariable=var_scale, width=10) ent_scale.bind("<Return>", self.handle_event) var_ref_level = tk.StringVar(self.pane.settings, str(self.ref_level)) ent_ref_level = ttk.Entry(self.pane.settings, textvariable=var_ref_level, width=10) ent_ref_level.bind("<Return>", self.handle_event) var_vbw = tk.StringVar(self.pane.settings, str(self.vbw)) ent_vbw = ttk.Entry(self.pane.settings, textvariable=var_vbw, width=10) ent_vbw.bind("<Return>", self.handle_event) var_window = tk.StringVar(self.pane.settings, str(self.window)) cb_window = ttk.Combobox(self.pane.settings, textvariable=var_window, width=9) cb_window.configure(values=[k for k in WindowLUT.keys()]) cb_window.bind("<<ComboboxSelected>>", self.handle_event) self.pane.wgts["scale"] = ent_scale self.pane.sets["scale"] = var_scale self.pane.wgts["ref_level"] = ent_ref_level self.pane.sets["ref_level"] = var_ref_level self.pane.wgts["vbw"] = ent_vbw self.pane.sets["vbw"] = var_vbw self.pane.wgts["window"] = cb_window self.pane.sets["window"] = var_window ttk.Label(self.pane.settings, text="Scale/Div").grid(row=row, column=0) ent_scale.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Ref Level").grid(row=row, column=0) ent_ref_level.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="VBW").grid(row=row, column=0) ent_vbw.grid(row=row, column=1) row += 1 ttk.Label(self.pane.settings, text="Window").grid(row=row, column=0) cb_window.grid(row=row, column=1) row += 1 return rowInitialize settings panel
def handle_event(self, event)-
Expand source code
def handle_event(self, event): if event.widget == self.pane.wgts["scale"]: self.set_scale(self.pane.sets["scale"].get()) elif event.widget == self.pane.wgts["ref_level"]: self.set_ref_level(self.pane.sets["ref_level"].get()) elif event.widget == self.pane.wgts["vbw"]: self.set_vbw(self.pane.sets["vbw"].get()) elif event.widget == self.pane.wgts["window"]: self.set_window(self.pane.sets["window"].get()) def psd(self, samps)-
Expand source code
def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd(samps, self.parent.model.sink.get_fs().raw, vbw, self.window) def set_ref_level(self, ref)-
Expand source code
def set_ref_level(self, ref): """Set plot ref level""" try: ref = float(ref) self.ref_level = ref except ValueError: ref = self.ref_level self.pane.sets["ref_level"].set(str(self.ref_level))Set plot ref level
def set_scale(self, scale)-
Expand source code
def set_scale(self, scale): """set plot scale""" try: scale = float(scale) self.scale = scale except ValueError: scale = self.scale self.pane.sets["scale"].set(str(self.scale))set plot scale
def set_vbw(self, smooth)-
Expand source code
def set_vbw(self, smooth): """Set plot vbw""" try: smooth = float(smooth) if smooth <= 0.0: smooth = 0.0 self.vbw = smooth except ValueError: smooth = self.vbw self.pane.sets["vbw"].set(str(self.vbw))Set plot vbw
def set_window(self, window)-
Expand source code
def set_window(self, window): """Set plot window function""" self.window = windowSet plot window function
def update(self)-
Expand source code
def update(self): self.plotter.canvas.draw()Update view plot
def update_f(self, f)-
Expand source code
def update_f(self, f): """Set plot xticks and xlabels"""Set plot xticks and xlabels
def update_nfft(self, nfft)-
Expand source code
def update_nfft(self, nfft): """Update plot nfft"""Update plot nfft
class FreqPlotControllerRT (parent,
pane: Panel,
**kwargs)-
Expand source code
class FreqPlotControllerRT(FreqPlotController): def __init__(self, parent, pane: Panel, **kwargs): self.overlap = kwargs.get("overlap", ) super().__init__(parent, pane, **kwargs) def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd_rt(samps, self.parent.model.get_nfft(), self.parent.model.mode.get_overlap(), self.parent.model.get_fs().raw, vbw, self.window) def _plot(self, samps): raise NotImplementedError() # --- GUI bind events and setters --- #Controller for view.tkGUI frequency-domain plots
Ancestors
- FreqPlotController
- pyspecan.controller.tkGUI.plot_base._PlotController
Subclasses
Methods
def psd(self, samps)-
Expand source code
def psd(self, samps): vbw = self.vbw if vbw <= 0: vbw = None return psd_rt(samps, self.parent.model.get_nfft(), self.parent.model.mode.get_overlap(), self.parent.model.get_fs().raw, vbw, self.window)
Inherited members
class TimePlotController (parent,
pane: Panel,
**kwargs)-
Expand source code
class TimePlotController(_PlotController): """Controller for view.tkGUI time-domain plots""" def __init__(self, parent, pane: Panel, **kwargs): super().__init__(parent, pane) self.draw_settings() def update(self): self.plotter.canvas.draw() def _plot(self, samps): # type: ignore raise NotImplementedError() def draw_settings(self, row=0): passController for view.tkGUI time-domain plots
Ancestors
- pyspecan.controller.tkGUI.plot_base._PlotController
Subclasses
Methods
def draw_settings(self, row=0)-
Expand source code
def draw_settings(self, row=0): passInitialize settings panel
def update(self)-
Expand source code
def update(self): self.plotter.canvas.draw()Update view plot