QMan5
QMan5

Reputation: 779

Unable to change the download button sidebar based on the tab chosen using Shiny Python

I would like to change the download buttons that appear based on the tab that is chosen. For example, if the tab is Main Visualization, I would like the following buttons to appear: download_heatmap and download_distribution. I would like download_piechart and download_barchart to only appear if "Additional Visualizations" tab is chosen. I'm running into problems when I try to apply this logic.

Here is the code:

from shiny import App, render, ui, reactive, session
import seaborn as sns
from shinywidgets import output_widget, render_widget

# Load the penguins dataset
penguins = sns.load_dataset("penguins").dropna()

# UI setup
app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.sidebar(
            ui.input_selectize("species", "Species:", choices=penguins["species"].unique().tolist(), multiple=True),
            ui.input_selectize("island", "Island:", choices=penguins["island"].unique().tolist(), multiple=True),
        ),
        # Place download buttons right below the sidebar
        ui.output_ui("download_buttons"),
        ui.navset_tab(
            ui.nav_panel("Main Visualizations", output_widget("heatmap_plot")),
            ui.nav_panel("Additional Visualizations", ui.h4("Pie Chart of Species Proportion"), output_widget("pie_chart")),
            id = 'my_tabset'
        )
    )
)
# Server
def server(input, output, session):
    filtered_data = reactive.Value(penguins)

    # Monitor active tab and dynamically render download buttons
    @output
    @render.ui
    def download_buttons():
        active_tab = reactive.Value(input.my_tabset)
        if active_tab == "Main Visualizations":
            # Render buttons for Main Visualizations
            return ui.div(
                ui.download_button("download_heatmap", "Download Heatmap", class_="download-btn download-btn-main"),
                ui.download_button("download_distribution", "Download Distribution Plot", class_="download-btn download-btn-main"),
                style="margin-top: 15px;"
            )
        else:
            # Render buttons for Additional Visualizations
            return ui.div(
                ui.download_button("download_piechart", "Download Pie Chart", class_="download-btn download-btn-additional"),
                ui.download_button("download_barchart", "Download Bar Chart", class_="download-btn download-btn-additional"),
                style="margin-top: 15px;"
            )

# Create the app
app = App(app_ui, server)

Upvotes: 0

Views: 36

Answers (0)

Related Questions