Render widget return nothing (no error and no output)

Dear everyone, I’ve started to create my second application on python (Shiny) and for this one, I’ve created three files:

  • app.py
  • appback/ui.py
  • appback/server.py

All the project uses a virtual environment (python3.9). app.py looks like:

exec(open("backapp/ui.py").read())

exec(open("backapp/server.py").read())

# run the app :
www_dir = Path(__file__).parent / "www"
app = App(app_ui, server, static_assets=www_dir, debug=True)

So, my problem is I’m trying to use plotly and of course shinywidgets but when I’m trying to use this example split between ui.py and server.py, nothing appear except the input button.

Code in ui.py:

                ui.nav(
                    " DATA ",
                    ui.tags.div(
                            ui.tags.br(),
                            ui.tags.div(
                                ui.output_ui("table_viz"),
                                class_="card-style",
                            ),
                            ui.tags.br(),
                            ui.tags.div(
                                ui.row(
                                    ui.column(
                                        3,
                                        ui.input_radio_buttons(
                                            "timestart_1",
                                            "Starting date:",
                                            timeline,
                                        ),
                                    ),
                                    ui.column(
                                        3,
                                        ui.input_radio_buttons(
                                            "timeend_1",
                                            "Ending date:",
                                            timeline,
                                        ),
                                    ),
                                    ui.column(
                                        3,
                                        ui.tags.div(
                                            ui.input_switch(
                                                "newold",
                                                "Old (default) or new employees",
                                            ),
                                            ui.input_action_button(
                                                "timebutton",
                                                "Show",
                                                style="justify-content: center;",
                                            ),
                                            ui.tags.br(),
                                        ),
                                    ),
                                ),
                            ),
                            ui.tags.div(
                                ui.output_ui("timetable_viz"),
                                ui.input_checkbox(
                                    "show_fit", "Show fitted line", value=True
                                ),
                                output_widget("scatterplot"),
                                class_="card-style",
                            ),
                        ),
                    ),
                    icon=ui.tags.i(class_="glyphicon glyphicon-th-list"),
                ),

Code in server.py:

# Generate some data and fit a linear regression
n = 10000
dat = np.random.RandomState(0).multivariate_normal([0, 0], [(1, 0.5), (0.5, 1)], n).T
x = dat[0]
y = dat[1]
fit = LinearRegression().fit(x.reshape(-1, 1), dat[1])
xgrid = np.linspace(start=min(x), stop=max(x), num=30)

def server(input, output, session: Session):
    scatterplot = go.FigureWidget(
        data=[
            go.Scattergl(
                x=x,
                y=y,
                mode="markers",
                marker=dict(color="rgba(0, 0, 0, 0.05)", size=5),
            ),
            go.Scattergl(
                x=xgrid,
                y=fit.intercept_ + fit.coef_[0] * xgrid,
                mode="lines",
                line=dict(color="red", width=2),
            ),
        ],
        layout={"showlegend": False},
    )

    register_widget("scatterplot", scatterplot)

    @reactive.Effect
    def _():
        scatterplot.data[1].visible = input.show_fit()

To add something, when I replace app.py by the content of the example then it’s work fine (I think there is no install problem). And every other things works fine in the app.

After several tests, one issue is possible for me; render_widget doesn’t work because is inside an element of a ui.nav_menu.

PS: It’s a little bit complicated for me to provide my code but I could found a solution to this problem if it’s necessary.