import gradio as gr import pandas as pd import json import random # Parameters for value checking parameters = { "speed": 50, "speed_uncertainty": 4, "flow": 10.4, "flow_uncertainty": 0.2, "env_temperature": 35, "sup_temperature": 50, "gap": 0.1, } def check_value(parameter, value, parameters): if parameter == "Velocity": return parameters["speed"] - parameters["speed_uncertainty"] <= value <= parameters["speed"] + parameters["speed_uncertainty"] elif parameter == "Flow": return parameters["flow"] - parameters["flow_uncertainty"] <= value <= parameters["flow"] + parameters["flow_uncertainty"] elif parameter == "Env. Temperature": return value < parameters["env_temperature"] elif parameter == "Sup. Temperature": return value < parameters["sup_temperature"] elif parameter == "Gap": return value < parameters["gap"] return None def generate_table_html(df, parameters): # Build CSS and table html = """ """ html += '\n' html += " \n" for col in df.columns: html += f" \n" html += " \n" html += " \n" for _, row in df.iterrows(): row_data = row.to_dict() row_data_json = json.dumps(row_data) html += " \n" for col in df.columns: value = row[col] color = check_value(col, value, parameters) style = f' style="color: {"#00C005" if color else "#DE0000"};"' if color is not None else "" html += f' {value}\n' # When the button is clicked, call sendToPython with the row's JSON data. html += f' \n' html += " \n" html += "
{col}Details
\n" return html script = """ """ def generate_filename(): uf = f"UF{random.randint(1, 5)}" cd = "CD" pr1 = f"PR{random.randint(10, 99)}" pr2 = f"PR{random.randint(10, 99)}" return f"{uf}_{cd}_{pr1}_{pr2}" # Create a sample DataFrame data = { "File name": [generate_filename() for _ in range(10)], "Status PDF": [random.choice(["Complete", "Incomplete", "Error"]) for _ in range(10)], "Start-End": [f"{random.randint(0, 12)}:00 - {random.randint(13, 23)}:59" for _ in range(10)], "Env. Temperature": [round(random.uniform(15.0, 30.0), 2) for _ in range(10)], "Sup. Temperature": [round(random.uniform(30.0, 50.0), 2) for _ in range(10)], "Flow": [round(random.uniform(5.0, 20.0), 2) for _ in range(10)], "Velocity": [round(random.uniform(0.5, 5.0), 2) for _ in range(10)], "Gap": [round(random.uniform(0.1, 1.0), 2) for _ in range(10)], "Observations": ["" for _ in range(10)] } df = pd.DataFrame(data) def handle_click(input_value): print("Button clicked, row data:", input_value) return input_value with gr.Blocks(head=script) as demo: gr.Markdown("### Data Table with Action Button") # Use a hidden gr.Textbox (which reliably fires change events) to capture the data. hidden_textbox = gr.Textbox(value="", elem_id="hidden_textbox", visible=False) # Render the table as HTML. html_component = gr.HTML(generate_table_html(df, parameters), container=True) hidden_textbox.input(fn=handle_click, inputs=[hidden_textbox], outputs=[hidden_textbox]) if __name__ == "__main__": demo.launch()