To receive notifications about scheduled maintenance, please subscribe to the mailing-list gitlab-operations@sympa.ethz.ch. You can subscribe to the mailing-list at https://sympa.ethz.ch

Commit d921ac73 authored by holukas's avatar holukas
Browse files

cumulative multipanels, more main menu items

parent 125456c3
This diff is collapsed.
,"('wind_sector', '[deg]')","('co2_flux', '[µmol+1s-1m-2]')","('wind_dir', '[deg_from_north]')","('co2_flux_mean', '[µmol+1s-1m-2]')","('width', '[aux]')"
0,0,7,7,2.6052242857142858,38
1,40,42,42,5.660200309523809,38
2,80,183,184,4.887439038251369,38
3,120,184,184,-5.157466070652175,38
4,160,42,42,-2.580190476190476,38
5,200,23,24,0.049925130434782874,38
6,240,148,148,-8.585251202702706,38
7,280,237,239,-10.141148848101258,38
8,320,14,14,0.2729282857142858,38
9,360,4,4,4.523320000000001,38
,wind_sector,air_heat_capacity,wind_dir,air_heat_capacity_mean,width
,[deg],[J+1kg-1K-1],[deg_from_north],[J+1kg-1K-1],[aux]
0,0,7,7,1010.3,38
1,40,42,42,1010.2783333333332,38
2,80,184,184,1009.9490217391306,38
3,120,184,184,1010.7709239130437,38
4,160,42,42,1011.787380952381,38
5,200,24,24,1011.2420833333332,38
6,240,148,148,1010.7413513513516,38
7,280,239,239,1010.7489958158997,38
8,320,14,14,1010.5907142857143,38
9,360,4,4,1010.1275,38
wind_sector,co2_flux,wind_dir,co2_flux_SD,width
[deg],[µmol+1s-1m-2],[deg_from_north],[µmol+1s-1m-2],[aux]
0,7,7,12.899456440887805,38
40,42,42,4.245937194245022,38
80,183,184,8.847126663711125,38
120,184,184,13.269810187915764,38
160,42,42,21.00250223542005,38
200,23,24,12.44885757432296,38
240,148,148,12.95761377031849,38
280,237,239,14.034680187293697,38
320,14,14,14.181566796706791,38
360,4,4,2.8845370073664625,38
wind_sector,co2_flux,wind_dir,co2_flux_SD,width
[deg],[µmol+1s-1m-2],[deg_from_north],[µmol+1s-1m-2],[aux]
0,7,7,12.899456440887805,38
40,42,42,4.245937194245022,38
80,183,184,8.847126663711125,38
120,184,184,13.269810187915764,38
160,42,42,21.00250223542005,38
200,23,24,12.44885757432296,38
240,148,148,12.95761377031849,38
280,237,239,14.034680187293697,38
320,14,14,14.181566796706791,38
360,4,4,2.8845370073664625,38
wind_sector,co2_mixing_ratio,wind_dir,co2_mixing_ratio_count,width
[deg],[µmol+1mol_d-1],[deg_from_north],[µmol+1mol_d-1],[aux]
0,7,7,7,38
40,42,42,42,38
80,183,183,183,38
120,184,184,184,38
160,42,42,42,38
200,23,23,23,38
240,148,148,148,38
280,237,237,237,38
320,14,14,14,38
360,4,4,4,38
......@@ -19,14 +19,84 @@ from modboxes.HiResTests import HiResTests_gui as modbox_hrt
from modboxes.Modifications import Modifications_gui as modbox_mf
from modboxes.OutlierDetection import OutlierDetection_gui as modbox_od
from modboxes.Pipelines import Pipelines_gui as modbox_pn
from modboxes.Plots import Plots_gui as modbox_pl
from modboxes.QualityControl import QualityControl_gui as modbox_qc
# import matplotlib
# from modboxes import resampling as modbox_rs
class TopMenu:
""" Create dropdown menu at the top. """
def __init__(self, main_win, ctx):
self.ctx = ctx
self.mainMenu = main_win.menuBar()
self.btn_fileImportSettings, self.btn_fileAddFile, self.btn_fileLoadNewFile, self.btn_fileOutputDir = \
self.file()
self.btn_plotsCorrMatrix, self.btn_plotsHexbins, self.btn_plotsMultiPanel, self.btn_plotsScatter, \
self.btn_plotsUstarThresholdsFXN, self.btn_plotsWindSectors, self.btn_plotsCumulative, self.btn_plotsHeatmap = \
self.plots()
self.btn_analysesUstarDetectionAuto, self.btn_analysesAggregator, self.btn_analysesNetGHGBalance = \
self.analyses()
self.btn_gapfillingMDS, self.btn_gapfillingRandomForest = \
self.gap_filling()
def file(self):
""" File menu """
menu = self.mainMenu.addMenu('&File')
btn_fileLoadNewFile = gui_elements.menu_action(txt='Load New File ...', menu=menu,
icon=False)
btn_fileAddFile = gui_elements.menu_action(txt='Add File ...', menu=menu,
icon=self.ctx.icon_btn_menu_add)
btn_fileImportSettings = gui_elements.menu_action(txt='File Import Settings ...', menu=menu,
icon=self.ctx.icon_btn_menu_settings)
btn_fileOutputDir = gui_elements.menu_action(txt='Output Directory ...', menu=menu,
icon=self.ctx.icon_btn_menu_settings)
return btn_fileImportSettings, btn_fileAddFile, btn_fileLoadNewFile, btn_fileOutputDir
def plots(self):
""" Plots menu """
menu = self.mainMenu.addMenu('Plots')
btn_plotsCorrMatrix = gui_elements.menu_action(txt='Correlation Matrix', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsCumulative = gui_elements.menu_action(txt='Cumulative', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsHeatmap = gui_elements.menu_action(txt='Heatmap', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsHexbins = gui_elements.menu_action(txt='Hexbins', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsMultiPanel = gui_elements.menu_action(txt='Multipanel', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsScatter = gui_elements.menu_action(txt='Scatter', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsUstarThresholdsFXN = gui_elements.menu_action(txt='u* Thresholds (FXN)', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_plotsWindSectors = gui_elements.menu_action(txt='Wind Sectors', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
return btn_plotsCorrMatrix, btn_plotsHexbins, btn_plotsMultiPanel, btn_plotsScatter, \
btn_plotsUstarThresholdsFXN, btn_plotsWindSectors, btn_plotsCumulative, btn_plotsHeatmap
def analyses(self):
menu = self.mainMenu.addMenu('Analyses')
btn_analysesAggregator = gui_elements.menu_action(txt='Aggregator', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_analysesNetGHGBalance = gui_elements.menu_action(txt='Net GHG Balance', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
btn_analysesUstarDetectionAuto = gui_elements.menu_action(txt='Ustar Threshold Detection', menu=menu,
icon=self.ctx.icon_open_in_new_tab)
return btn_analysesUstarDetectionAuto, btn_analysesAggregator, btn_analysesNetGHGBalance
def gap_filling(self):
menu = self.mainMenu.addMenu('Gap-filling')
btn_gapfillingMDS = gui_elements.menu_action(txt='Marginal Distribution Sampling (MDS)',
menu=menu, icon=self.ctx.icon_open_in_new_tab)
btn_gapfillingRandomForest = gui_elements.menu_action(txt='Random Forest',
menu=menu, icon=self.ctx.icon_open_in_new_tab)
return btn_gapfillingMDS, btn_gapfillingRandomForest
# def get(self):
# return self.mainMenu
class Ui_MainWindow(object):
......@@ -65,7 +135,11 @@ class Ui_MainWindow(object):
# MainWindow.setWindowIcon(QIcon('gui/Icons/python_icon.png'))
MainWindow.resize(1920, 1080)
MainWindow.setContentsMargins(0, 0, 0, 0)
self.TopMenu = self.make_TopMenu(main_win=MainWindow)
# Top menu
self.TopMenu = TopMenu(main_win=MainWindow, ctx=self.ctx)
# self.TopMenu = obj_top_menu.get()
# self.TopMenu = self.make_TopMenu(main_win=MainWindow)
# Init CentralWidget (level 1)
self.CentralWidget = qw.QWidget(MainWindow)
......@@ -109,44 +183,6 @@ class Ui_MainWindow(object):
# Add CentralWidget to MainWindow
MainWindow.setCentralWidget(self.CentralWidget)
def make_TopMenu(self, main_win):
"""
Create dropdown menu at the top.
:param main_win: Main GUI window
:return: menuBar object
"""
mainMenu = main_win.menuBar()
# FILE MENU
# -----------------------------------------------------
fileMenu = mainMenu.addMenu('&File')
self.act_loadNewFile, self.btn_loadNewFile = \
gui_elements.menu_action(txt='Load New File ...', menu=fileMenu)
self.act_addFile, self.btn_addFile = \
gui_elements.menu_action(txt='Add File ...', menu=fileMenu)
self.act_fileImportSettings, self.btn_fileImportSettings = \
gui_elements.menu_action(txt='File Import Settings ...', menu=fileMenu)
fileMenu.addAction(self.act_loadNewFile)
fileMenu.addAction(self.act_addFile)
fileMenu.addAction(self.act_fileImportSettings)
# PROJECT MENU
# -----------------------------------------------------
projectMenu = mainMenu.addMenu('Project')
self.act_projectOutDir, self.btn_projectOutDir = \
gui_elements.menu_action(txt='Output Directory ...', menu=projectMenu)
projectMenu.addAction(self.act_projectOutDir)
# PLOTS MENU
# -----------------------------------------------------
plotsMenu = mainMenu.addMenu('Plots')
self.act_corrMatrix, self.btn_corrMatrix = \
gui_elements.menu_action(txt='Correlation Matrix', menu=plotsMenu)
plotsMenu.addAction(self.act_corrMatrix)
return mainMenu
def make_VariableList(self):
css_id = 'frm_VariableList'
maxw = 600
......@@ -172,17 +208,6 @@ class Ui_MainWindow(object):
self.lst_Variables.setAlternatingRowColors(True)
# self.lst_Variables.setSelectionMode(qw.QListWidget.MultiSelection)
# # Selection buttons
# self.btn_SelectFile = GUI_Elements.lyt_Button(lyt=lyt_VariableList,
# txt="Select File ...",
# css_id='none')
# self.btn_AddDataFromFile = GUI_Elements.lyt_Button(lyt=lyt_VariableList,
# txt="Add Data From File ...",
# css_id='none')
# self.btn_FileSettings = GUI_Elements.lyt_Button(lyt=lyt_VariableList,
# txt="File Settings ...",
# css_id='none')
frm_VariableList.setLayout(lyt_VariableList)
return frm_VariableList
......@@ -293,7 +318,7 @@ class Ui_MainWindow(object):
# Add ModBoxes to GUI
# Adds category button, options buttons, refinements buttons
self.add_modbox_Plots() # in option stack #0
# self.add_modbox_Plots() # in option stack #0
self.add_modbox_QualityControl() # in option stack #1
self.add_modbox_OutlierDetection() # in option stack #2
self.add_modbox_GapFilling() # in option stack #3
......@@ -305,8 +330,8 @@ class Ui_MainWindow(object):
self.add_modbox_Export() # in option stack #9
stretch = gui_building_blocks.StretchWidget().get_widget()
self.grd_categories.addWidget(stretch, 5, 0, 1, 1)
self.grd_categories.setRowStretch(5, 1)
self.grd_categories.addWidget(stretch, 9, 0, 1, 1)
self.grd_categories.setRowStretch(9, 1)
# CONTROLS FRAME
# --------------
......@@ -354,11 +379,11 @@ class Ui_MainWindow(object):
from gui.gui_timerange_controls import TimeRangeControls
self.obj_time_range_controls = TimeRangeControls(layout=layout)
def add_modbox_Plots(self):
self.modbox_plots = modbox_pl.AddControls(grd_Categories=self.grd_categories,
stk_Options=self.stk_category_options,
stk_Refinements=self.stk_option_refinements,
ctx=self.ctx)
# def add_modbox_Plots(self):
# self.modbox_plots = modbox_pl.AddControls(grd_Categories=self.grd_categories,
# stk_Options=self.stk_category_options,
# stk_Refinements=self.stk_option_refinements,
# ctx=self.ctx)
def add_modbox_QualityControl(self):
self.modbox_quality_control = \
......@@ -507,7 +532,8 @@ class Ui_MainWindow(object):
# First date, last date, dtype
self.lbl_run_id = gui_elements.add_label_pair_to_grid_layout(txt='Run ID', css_ids=css_ids, layout=lyt,
row=1, col=col, orientation=orientation)
self.lbl_startdate_val = gui_elements.add_label_pair_to_grid_layout(txt='Start Date', css_ids=css_ids, layout=lyt,
self.lbl_startdate_val = gui_elements.add_label_pair_to_grid_layout(txt='Start Date', css_ids=css_ids,
layout=lyt,
row=2, col=col, orientation=orientation)
self.lbl_enddate_val = gui_elements.add_label_pair_to_grid_layout(txt='End Date', css_ids=css_ids, layout=lyt,
row=3, col=col, orientation=orientation)
......@@ -519,12 +545,16 @@ class Ui_MainWindow(object):
row=6, col=col, orientation=orientation)
# Number of values, missing values
self.lbl_nov_val = gui_elements.add_label_pair_to_grid_layout(txt='Number Of Values', css_ids=css_ids, layout=lyt,
self.lbl_nov_val = gui_elements.add_label_pair_to_grid_layout(txt='Number Of Values', css_ids=css_ids,
layout=lyt,
row=7, col=col, orientation=orientation)
self.lbl_missingvalues_val = gui_elements.add_label_pair_to_grid_layout(txt='Missing Values', css_ids=css_ids, layout=lyt,
self.lbl_missingvalues_val = gui_elements.add_label_pair_to_grid_layout(txt='Missing Values', css_ids=css_ids,
layout=lyt,
row=8, col=col, orientation=orientation)
self.lbl_missingvaluesperc_val = gui_elements.add_label_pair_to_grid_layout(txt='Missing Values %', css_ids=css_ids, layout=lyt,
row=9, col=col, orientation=orientation)
self.lbl_missingvaluesperc_val = gui_elements.add_label_pair_to_grid_layout(txt='Missing Values %',
css_ids=css_ids, layout=lyt,
row=9, col=col,
orientation=orientation)
# Mean & SD
self.lbl_mean_val = gui_elements.add_label_pair_to_grid_layout(txt='Mean', css_ids=css_ids, layout=lyt,
......@@ -554,7 +584,8 @@ class Ui_MainWindow(object):
self.lbl_mad_val = gui_elements.add_label_pair_to_grid_layout(txt='MAD', css_ids=css_ids, layout=lyt,
row=20, col=col, orientation=orientation)
self.lbl_mad_val.setToolTip('median absolute deviation')
self.lbl_cumsum_val = gui_elements.add_label_pair_to_grid_layout(txt='Cumulative Sum', css_ids=css_ids, layout=lyt,
self.lbl_cumsum_val = gui_elements.add_label_pair_to_grid_layout(txt='Cumulative Sum', css_ids=css_ids,
layout=lyt,
row=21, col=col, orientation=orientation)
self.lbl_cumsum_val.setToolTip('cumulative sum')
......
......@@ -6,9 +6,9 @@ adding buttons, lists, CSS classes, ...
from PyQt5 import QtCore as qtc
from PyQt5 import QtWidgets as qw
from PyQt5.QtGui import QIcon
def menu_action(txt, menu):
def menu_action(txt, menu, icon):
"""
Add button to top menu.
......@@ -24,9 +24,20 @@ def menu_action(txt, menu):
"""
action = qw.QWidgetAction(menu)
button = qw.QPushButton(txt)
if icon:
button.setIcon(QIcon(icon))
# button.setToolTip('Look, a tooltip!')
# a.setProperty('labelClass', 'top_menu_dropdown_item')
action.setDefaultWidget(button)
return action, button
menu.addAction(action)
# button = qw.QPushButton(text=txt)
# from PyQt5.QtGui import QIcon
# button.setIcon(QIcon(icon))
# grid.addWidget(button, row, col, rowspan, colspan)
return button
def add_frame_grid():
......@@ -50,7 +61,7 @@ def add_button_to_grid(grid_layout, txt, css_id, row, col, rowspan, colspan):
def add_iconbutton_to_grid(grid, txt, css_id, row, col, rowspan, colspan, icon):
button = qw.QPushButton(text=txt)
button.setProperty('labelClass', css_id)
from PyQt5.QtGui import QIcon
button.setIcon(QIcon(icon))
# button.setToolTip('Look, a tooltip!')
grid.addWidget(button, row, col, rowspan, colspan)
......
This diff is collapsed.
......@@ -73,7 +73,7 @@ class MakeNewTab:
self.colname_pretty_string = colname_pretty_string
self.data_df = data_df
self.title = f"AGGREGATOR {new_tab_id}" # used in tab name and header
self.title = f"Aggregator {new_tab_id}" # used in tab name and header
# Create tab menu (refinements)
self.drp_var, self.drp_agg_type, self.lne_upper_lim, self.lne_lower_lim, self.drp_grouping, \
......
......@@ -23,11 +23,11 @@ def connect(self, opt_tab_idx):
self.modbox_analyses.RunningLinReg.ref_btn_showInPlot.clicked.connect(
lambda: self.call_an_RunningLinRegr())
# Option: uSTAR THRESHOLD DETECTION
self.modbox_analyses.uStarDetection.opt_btn.clicked.connect((
lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_uStarDetection_stackTab)))
self.modbox_analyses.uStarDetection.ref_btn_showInNewTab.clicked.connect(
lambda: self.make_tab(make_tab='USTAR_DETECTION'))
# # Option: uSTAR THRESHOLD DETECTION
# self.modbox_analyses.uStarDetection.opt_btn.clicked.connect((
# lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_uStarDetection_stackTab)))
# self.modbox_analyses.uStarDetection.ref_btn_showInNewTab.clicked.connect(
# lambda: self.make_tab(make_tab='USTAR_DETECTION'))
# Option: GAP FINDER
self.modbox_analyses.GapFinder.opt_btn.clicked.connect(
......@@ -41,17 +41,17 @@ def connect(self, opt_tab_idx):
self.modbox_analyses.BeforeAfterEvent.ref_btn_showInPlot.clicked.connect(
lambda: self.call_an_BeforeAfterEvent())
# Option: AGGREGATOR
self.modbox_analyses.Aggregator.opt_btn.clicked.connect(
lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_Aggregator_stackTab))
self.modbox_analyses.Aggregator.ref_btn_showInNewTab.clicked.connect(
lambda: self.make_tab(make_tab='AGGREGATOR'))
# # Option: AGGREGATOR
# self.modbox_analyses.Aggregator.opt_btn.clicked.connect(
# lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_Aggregator_stackTab))
# self.modbox_analyses.Aggregator.ref_btn_showInNewTab.clicked.connect(
# lambda: self.make_tab(make_tab='AGGREGATOR'))
# Option: NET GHG BALANCE
self.modbox_analyses.NetGHGBalance.opt_btn.clicked.connect(
lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_NetGHGBalance_stackTab))
self.modbox_analyses.NetGHGBalance.ref_btn_showInNewTab.clicked.connect(
lambda: self.make_tab(make_tab='NET_GHG_BALANCE'))
# # Option: NET GHG BALANCE
# self.modbox_analyses.NetGHGBalance.opt_btn.clicked.connect(
# lambda: self.view_stk_refinement(tab_idx=self.modbox_analyses.an_ref_NetGHGBalance_stackTab))
# self.modbox_analyses.NetGHGBalance.ref_btn_showInNewTab.clicked.connect(
# lambda: self.make_tab(make_tab='NET_GHG_BALANCE'))
return self
......@@ -74,49 +74,31 @@ class AddControls:
opt_frame, opt_layout = gui_elements.add_frame_grid()
self.add_options(layout=opt_layout)
# Aggregator
self.an_ref_Aggregator_stackTab = 25
self.Aggregator = Aggregator.AddControlsToMain(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements,
ctx=self.ctx)
# Before / After Event
self.an_ref_BeforeAfterEvent_stackTab = 26 # index of the tab in refinements box, called in main
self.an_ref_BeforeAfterEvent_stackTab = 15 # index of the tab in refinements box, called in main
self.BeforeAfterEvent = BeforeAfterEvent.AddControls(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements)
# Class Finder
self.an_ref_ClassFinder_stackTab = 27 # index of the tab in refinements box, called in main
self.an_ref_ClassFinder_stackTab = 16 # index of the tab in refinements box, called in main
self.ClassFinder = ClassFinder.AddControls(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements)
# Gap Finder
self.an_ref_GapFinder_stackTab = 28 # index of the tab in refinements box, called in main
self.an_ref_GapFinder_stackTab = 17 # index of the tab in refinements box, called in main
self.GapFinder = GapFinder.AddControls(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements)
# Net GHG Balance
self.an_ref_NetGHGBalance_stackTab = 29 # index of the tab in refinements box, called in main
self.NetGHGBalance = NetGHGBalance.AddControlsToMain(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements,
ctx=self.ctx)
# Running Linear Regression
self.an_ref_RunningLinRegr_stackTab = 30 # index of the tab in refinements box, called in main
self.an_ref_RunningLinRegr_stackTab = 18 # index of the tab in refinements box, called in main
self.RunningLinReg = RunningLinReg.AddControls(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements)
# ustar Threshold Detection
self.an_ref_uStarDetection_stackTab = 31 # index of the tab in refinements box, called in main
self.uStarDetection = uStarDetection.AddControlsToMain(opt_stack=stk_Options, opt_frame=opt_frame,
opt_layout=opt_layout, ref_stack=stk_Refinements,
ctx=self.ctx)
def add_category(self):
# Category button_qual_A in categories grid (for stack selection)
self.cat_btn_showStack = gui_elements.add_iconbutton_to_grid(grid=self.grd_Categories,
txt=self.category, css_id='',
row=2, col=0, rowspan=1, colspan=1,
row=0, col=0, rowspan=1, colspan=1,
icon=self.ctx.icon_cat_analyses)
def add_options(self, layout):
......
......@@ -171,7 +171,7 @@ class GapFinder:
self.gapfinder_fullres_df.index.name: ['min', 'max'],
self.isval_cumsum_col: ['count']
})
# TODO hier weiter Fehler wenn keine gaps mehr gibt
# TODO Fehler wenn keine gaps mehr gibt
# Remove the original column names (tuples w/ two elements)
gapfinder_agg_df.columns = gapfinder_agg_df.columns.droplevel([0, 1])
......
......@@ -75,7 +75,8 @@ class MakeNewTab:
self.colname_pretty_string = colname_pretty_string
self.data_df = data_df
self.title = f"NGB {new_tab_id}" # used in tab name and header
linebreak = '\n'
self.title = f"Net GHG{linebreak}Balance {new_tab_id}" # used in tab name and header
# Create tab menu (refinements)
self.drp_co2_flux_var, self.drp_n2o_flux_var, self.drp_ch4_flux_var, self.btn_start, \
......
......@@ -75,7 +75,8 @@ class MakeNewTab:
self.col_dict_tuples = col_dict_tuples
self.data_df = data_df
self.title = f"USTAR {new_tab_id}" ## used in tab name and header
linebreak = '\n'
self.title = f"Ustar Threshold{linebreak}Detection {new_tab_id}" ## used in tab name and header
# Create tab menu (refinements)
self.drp_flux, self.drp_ta, self.lne_TA_numClasses, self.drp_uStar, self.lne_uStar_numClasses, \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment