import random import gradio as gr demo = gr.Blocks() with demo: gr.Markdown( "Load the flashcards in the table below, then use the Practice tab to practice." ) with gr.Tabs(): with gr.TabItem("Word Bank"): flashcards_table = gr.Dataframe(headers=["front", "back"], type="array") with gr.TabItem("Practice"): with gr.Row(): with gr.Column(): front = gr.Textbox(label="Prompt") with gr.Row(): new_btn = gr.Button("New Card").style(full_width=True) flip_btn = gr.Button("Flip Card").style(full_width=True) with gr.Column(visible=False) as answer_col: back = gr.Textbox(label="Answer") selected_card = gr.Variable() with gr.Row(): correct_btn = gr.Button( "Correct", ).style(full_width=True) incorrect_btn = gr.Button("Incorrect").style(full_width=True) with gr.TabItem("Results"): results = gr.Variable(value={}) correct_field = gr.Markdown("# Correct: 0") incorrect_field = gr.Markdown("# Incorrect: 0") gr.Markdown("Card Statistics: ") results_table = gr.Dataframe(headers=["Card", "Correct", "Incorrect"]) def load_new_card(flashcards): card = random.choice(flashcards) return ( card, card[0], gr.Column.update(visible=False), ) new_btn.click( load_new_card, [flashcards_table], [selected_card, front, answer_col], ) def flip_card(card): return card[1], gr.Column.update(visible=True) flip_btn.click(flip_card, [selected_card], [back, answer_col]) def mark_correct(card, results): if card[0] not in results: results[card[0]] = [0, 0] results[card[0]][0] += 1 correct_count = sum(result[0] for result in results.values()) return ( results, f"# Correct: {correct_count}", [[front, scores[0], scores[1]] for front, scores in results.items()], ) def mark_incorrect(card, results): if card[0] not in results: results[card[0]] = [0, 0] results[card[0]][1] += 1 incorrect_count = sum(result[1] for result in results.values()) return ( results, f"# Inorrect: {incorrect_count}", [[front, scores[0], scores[1]] for front, scores in results.items()], ) correct_btn.click( mark_correct, [selected_card, results], [results, correct_field, results_table], ) incorrect_btn.click( mark_incorrect, [selected_card, results], [results, incorrect_field, results_table], ) if __name__ == "__main__": demo.launch()