import gradio as gr from random import shuffle import matplotlib.pyplot as plt import pickle DISCLAIMER = "**Caution! The questions from the test are AI generated and have not been validated by qualified persons. Therefore, interpret the test at your own risk.**" def validate_form(*inputs): score_map = { "Strongly Agree": 2, "Agree": 1, "Neutral": 0, "Disagree": -1, "Strongly Disagree": -2 } x_right = 0 x_left = 0 number_questions = len(inputs) for input_index in range(number_questions): checkbox = inputs[input_index] if checkbox is None: raise gr.Error("You forgot a checkbox!") tag = INPUT_INFO[input_index]["tag"] key = [k for k, v in LABELLING.items() if v == tag][0] if key == "x_right": x_right += score_map[checkbox] else: x_left += score_map[checkbox] final = x_right + (-x_left) fig, ax = plt.subplots() ax.hlines(1, 2*(-number_questions), 2*number_questions, linestyles='solid') ax.plot(final, 1, 'ro') ax.set_xticks([2*(-number_questions), 0, 2*number_questions]) ax.set_xticklabels([LABELLING["x_left"], 'Neutral', LABELLING["x_right"]]) ax.get_yaxis().set_visible(False) return plt with open('data.pkl', 'rb') as f: data = pickle.load(f) title = data["title"] description = data["description"] questions_x_right_formatted = data["questions_x_right_formatted"] questions_x_left_formatted = data["questions_x_left_formatted"] LABELLING = data["LABELLING"] INPUT_INFO = data["INPUT_INFO"] combined_questions = questions_x_left_formatted + questions_x_right_formatted shuffle(combined_questions) with gr.Blocks() as demo: title = gr.Markdown(f"# {title}") description = gr.Markdown(description) disclaimer = gr.Markdown(DISCLAIMER) inputs = [] for question_dict in combined_questions: question = list(question_dict.keys())[0] tag = list(question_dict.values())[0] checkbox = gr.inputs.Radio(choices=["Strongly Agree", "Agree", "Neutral", "Disagree", "Strongly Disagree"], label=question) inputs.append(checkbox) input_dict = {"question": question, "tag": tag} INPUT_INFO.append(input_dict) submit_button = gr.Button("Submit") plot = gr.Plot(label="Plot") submit_button.click(fn=validate_form, inputs=inputs, outputs=[plot], api_name="Submit") demo.launch()