import gradio as gr def add_assignment(assignments): """ add one blank assignment to the saved list """ assignments = assignments or [] return assignments + [""] def delete_assignment(assignments, index): """ delete one assignment using its position in the list """ assignments = assignments or [] if 0 <= index < len(assignments): assignments.pop(index) return assignments def update_assignment(assignments, new_text, index): """ save the updated text for one assignment """ assignments = assignments or [] if 0 <= index < len(assignments): assignments[index] = new_text return assignments def clear_all(): """ delete every assignment """ return [] with gr.Blocks(title="Assignment Tracker") as demo: gr.Markdown("# Assignment Tracker") gr.Markdown( "Click **Add assignment** whenever you need another textbox." ) # Start with no assignments. # The assignments are saved in the user's browser. saved_assignments = gr.BrowserState( value=[], key="assignment_tracker_data" ) with gr.Row(): add_button = gr.Button( "Add assignment", variant="primary" ) clear_button = gr.Button("Clear all") status = gr.Markdown() # This section redraws itself whenever saved_assignments changes. @gr.render(inputs=saved_assignments) def display_assignments(assignments): assignments = assignments or [] if len(assignments) == 0: gr.Markdown( "You currently have no assignments. " "Click **Add assignment** to create one." ) for index, assignment_text in enumerate(assignments): with gr.Row(): assignment_box = gr.Textbox( value=assignment_text, label=f"Assignment {index + 1}", placeholder="Enter an assignment...", lines=2, key=f"assignment-{index}" ) delete_button = gr.Button( "Delete", size="sm", key=f"delete-{index}" ) # Save whenever the user finishes editing the textbox. assignment_box.change( fn=lambda text, current_assignments, i=index: update_assignment( current_assignments, text, i ), inputs=[ assignment_box, saved_assignments ], outputs=saved_assignments ) # Delete this particular assignment. delete_button.click( fn=lambda current_assignments, i=index: delete_assignment( current_assignments, i ), inputs=saved_assignments, outputs=saved_assignments ) add_button.click( fn=add_assignment, inputs=saved_assignments, outputs=saved_assignments ) clear_button.click( fn=clear_all, inputs=None, outputs=saved_assignments ) if __name__ == "__main__": demo.launch()