I suspect this is related to this answer.
However, since you are already using ipywidgets, I wonder if there are other ways to achieve something like you want to do without adding in ipylab yet. You can have ipywidgets need something interacted with before it continues to do what it next does when it observes an appropriate change. I wonder if that sort of direction may be compatible with what you need here as it works with more modern Jupyter use.
All that workflow can be done in an .ipynb file with just ipywidgets and Voila.
Voila/Voici don’t show the code when rendered in the app mode.
Be sure to check out the Voila Gallery for some good representatives.
I pernsonally have made one that is very vaguely of your workflow here (code: here, with more accompanying information here), although that one doesn’t include filters for the data but you do choose what file. Hopefully it is close enough to give you some guidance.
Another option is to not switch to JupyterLab and keep using the older Jupyter Notebook (v6.4 and earlier) with the older server tech, too. However, I’m not sure how much time that will buy you since the server tech has updated to keep in step with JupyterLab and Jupyter Notebook 7+. I suspect NbClassic doesn’t allow Jupyter.notebook.execute_cells() because the server is the one built on newer JpyterLab tech. And of course this is all dependent on you controlling the versions and not updating once it works.