import gradio as gr todos = [] def get_todos_data(): data = [] for i, todo in enumerate(todos): status = "✅ Done" if todo["done"] else "⬜ Pending" data.append([i, todo["task"], status, "❌ Delete"]) return data def add_task(task): if task and task.strip(): todos.append({"task": task.strip(), "done": False}) return get_todos_data(), "" def handle_interaction(evt: gr.SelectData): if evt.index[1] == 2: index = evt.index[0] todos[index]["done"] = not todos[index]["done"] elif evt.index[1] == 3: index = evt.index[0] todos.pop(index) return get_todos_data() with gr.Blocks(title="Todo App") as app: gr.Markdown("

📝 Todo App

Built with anycoder

") with gr.Row(): task_input = gr.Textbox( label="New Task", placeholder="Enter a task and press Enter or click Add...", scale=4 ) add_btn = gr.Button("Add Task", variant="primary", scale=1) todo_table = gr.DataFrame( headers=["ID", "Task", "Status (Click to Toggle)", "Action (Click to Delete)"], datatype=["number", "str", "str", "str"], value=get_todos_data, interactive=False, wrap=True ) add_btn.click(add_task, inputs=[task_input], outputs=[todo_table, task_input]) task_input.submit(add_task, inputs=[task_input], outputs=[todo_table, task_input]) todo_table.select(handle_interaction, inputs=None, outputs=todo_table) if __name__ == "__main__": app.launch()