File size: 5,584 Bytes
0ad74ed
1
{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: blocks_flashcards"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import random\n", "\n", "import gradio as gr\n", "\n", "demo = gr.Blocks()\n", "\n", "def is_data_empty(flashcards):\n", "    if isinstance(flashcards, dict):\n", "        return all(item == '' for sublist in flashcards['data'] for item in sublist)\n", "    elif isinstance(flashcards, list):\n", "        return all(all(item == '' for item in sublist) for sublist in flashcards)\n", "    else:\n", "        return True\n", "\n", "with demo:\n", "    gr.Markdown(\n", "        \"Load the flashcards in the table below, then use the Practice tab to practice.\"\n", "    )\n", "\n", "    with gr.Tabs() as tabs:\n", "        with gr.Tab(\"Word Bank\"):\n", "            flashcards_table = gr.Dataframe(headers=[\"front\", \"back\"], type=\"array\")\n", "            flashcards_table.change(fn=lambda: print(flashcards_table.value))\n", "            practice_btn = gr.Button(\"Start Practice\")\n", "        with gr.Tab(\"Practice\", interactive=False, id=1) as practice_tab:\n", "            with gr.Row():\n", "                with gr.Column():\n", "                    front = gr.Textbox(label=\"Prompt\")\n", "                    with gr.Row():\n", "                        new_btn = gr.Button(\"New Card\")\n", "                        flip_btn = gr.Button(\"Flip Card\")\n", "                with gr.Column(visible=False) as answer_col:\n", "                    back = gr.Textbox(label=\"Answer\")\n", "                    selected_card = gr.State()\n", "                with gr.Row():\n", "                    correct_btn = gr.Button(\"Correct\")\n", "                    incorrect_btn = gr.Button(\"Incorrect\")\n", "\n", "            def start_practice(flashcards):\n", "                # if no cards entered into dataframe yet, return\n", "                if is_data_empty(flashcards):\n", "                    practice_tab = gr.Tab(\"Practice\", interactive=False, id=1)\n", "                    raise gr.Error(\"Please enter word prompts into the table.\")\n", "                    return [practice_tab, tabs]\n", "                else:\n", "                    practice_tab = gr.Tab(\"Practice\", interactive=True, id=1)\n", "                    new_tabs = gr.Tabs(selected=1)\n", "                    return [practice_tab, new_tabs]\n", "\n", "        with gr.Tab(\"Results\", visible=False) as results_tab:\n", "            results = gr.State(value={})\n", "            correct_field = gr.Markdown(\"# Correct: 0\")\n", "            incorrect_field = gr.Markdown(\"# Incorrect: 0\")\n", "            gr.Markdown(\"Card Statistics: \")\n", "            results_table = gr.Dataframe(headers=[\"Card\", \"Correct\", \"Incorrect\"])\n", "        practice_btn.click(start_practice, inputs=[flashcards_table], outputs=[practice_tab, tabs])\n", "\n", "        def load_new_card(flashcards):\n", "            card = random.choice(flashcards)\n", "            return (\n", "                card,\n", "                card[0],\n", "                gr.Column(visible=False),\n", "            )\n", "\n", "        new_btn.click(\n", "            load_new_card,\n", "            [flashcards_table],\n", "            [selected_card, front, answer_col],\n", "        )\n", "\n", "        def flip_card(card):\n", "            return card[1], gr.Column(visible=True)\n", "\n", "        flip_btn.click(flip_card, [selected_card], [back, answer_col])\n", "\n", "        def mark_correct(card, results):\n", "            if card[0] not in results:\n", "                results[card[0]] = [0, 0]\n", "            results[card[0]][0] += 1\n", "            correct_count = sum(result[0] for result in results.values())\n", "            return (\n", "                results,\n", "                f\"# Correct: {correct_count}\",\n", "                [[front, scores[0], scores[1]] for front, scores in results.items()],\n", "            )\n", "\n", "        def mark_incorrect(card, results):\n", "            if card[0] not in results:\n", "                results[card[0]] = [\n", "                    0, 0]\n", "            results[card[0]][1] += 1\n", "            incorrect_count = sum(result[1] for result in results.values())\n", "            return (\n", "                results,\n", "                f\"# Inorrect: {incorrect_count}\",\n", "                [[front, scores[0], scores[1]] for front, scores in results.items()],\n", "            )\n", "\n", "        def toggle_results_tab():\n", "            return gr.Tab(\"Results\", visible=True)\n", "\n", "        correct_btn.click(\n", "            mark_correct,\n", "            [selected_card, results],\n", "            [results, correct_field, results_table],\n", "        )\n", "\n", "        incorrect_btn.click(mark_incorrect, [selected_card, results], [results, incorrect_field, results_table])\n", "\n", "        # set results tab to visible when correct or incorrect button is clicked\n", "        correct_btn.click(fn=toggle_results_tab, outputs=[results_tab])\n", "        incorrect_btn.click(fn=toggle_results_tab, outputs=[results_tab])\n", "\n", "if __name__ == \"__main__\":\n", "    demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}