Пример #1
0
def main():
    try:
        # Step 1: Add an exit button
        Button(
            master=db.ma_setup_frame,
            text="X",
            command=partial(end_program, db.ma_setup_frame),
            bg='#a60000',
            fg='white',
            activebackground='#d60000',
            activeforeground='white',
        ).grid(row=0, column=100, sticky=NE)

        # Add some spacing below the exit button
        # db.ma_setup_frame.grid_rowconfigure(1, weight=1, minsize=50)

        # Step 2: Create Checkboxes for Test Type and Difficulty
        difficulties = ('EASY', 'MODERATE', 'HARD', 'PASS')
        types = ('ADDITION', 'SUBTRACTION', 'MULTIPLICATION', 'DIVISION')
        db.ma_checks = {}

        for index, name in enumerate(difficulties):
            # print(name, index)
            db.ma_checks[name] = IntVar()
            Checkbutton(master=db.ma_setup_frame,
                        text=difficulties[index],
                        variable=db.ma_checks[name],
                        font=db.DefaultFont).grid(row=2,
                                                  column=index,
                                                  sticky=W)

        for index, name in enumerate(types):
            # print(name, index)
            db.ma_checks[name] = IntVar()
            Checkbutton(master=db.ma_setup_frame,
                        text=types[index],
                        variable=db.ma_checks[name],
                        font=db.DefaultFont).grid(row=3,
                                                  column=index,
                                                  sticky=W)

        # Add some spacing below the exit button
        db.ma_setup_frame.grid_rowconfigure(4, weight=1, minsize=150)

        # Step 3: Add a 'Start' Button
        Button(
            master=db.ma_setup_frame,
            text="Start Test",
            command=start,
            activebackground="blue",
            activeforeground="white",
            bg="white",
            fg="black",
            font=db.DefaultFont,
        ).grid(row=4, columnspan=5, ipadx=200, pady=20)

    except Exception as e:
        s.error_handler(db.ma_setup_frame, e, 5)

    db.ma_setup_frame.pack()
Пример #2
0
def setup():
    try:
        # Step 1: Add an exit button
        Button(
            master=db.nb_setup_frame,
            text="X",
            command=lambda: end_program(db.nb_setup_frame),
            bg='#a60000',
            fg='white',
            activebackground='#d60000',
            activeforeground='white',
            font=db.DefaultFont,
        ).grid(row=0, column=100, sticky=NE)

        # Step 2: Create Checkboxes for Test Type and Difficulty
        difficulties = ('7 sec/trial', '5 sec/trial', '3 sec/trial')
        types = ('1-BACK', '2-BACK', '3-BACK')
        db.grid_boxes = {}

        for index, name in enumerate(difficulties):
            # print(name, index)
            db.grid_boxes[name] = IntVar()
            Checkbutton(
                master=db.nb_setup_frame,
                text=difficulties[index],
                variable=db.grid_boxes[name],
                font=db.DefaultFont
            ).grid(row=2, column=index, sticky=W)

        for index, name in enumerate(types):
            # print(name, index)
            db.grid_boxes[name] = IntVar()
            Checkbutton(
                master=db.nb_setup_frame,
                text=types[index],
                variable=db.grid_boxes[name],
                font=db.DefaultFont
            ).grid(row=3, column=index, sticky=W)

        # Add some spacing below the checkboxes
        db.nb_setup_frame.grid_rowconfigure(4, weight=1, minsize=150)

        # Step 3: Add a 'Start' Button
        Button(
            master=db.nb_setup_frame,
            text="Start Test",
            command=start,
            activebackground="blue",
            activeforeground="white",
            bg="white",
            fg="black",
            font=db.DefaultFont,
        ).grid(row=4, columnspan=5, ipadx=200, pady=20)

    except Exception as e:
        s.error_handler(db.nb_setup_frame, e, 6)

    db.nb_setup_frame.pack()
Пример #3
0
def setup():
    try:
        Button(master=db.calibration_setup,
               text="X",
               command=lambda: s.exit_test(db.calibration_setup, None),
               bg='#a60000',
               fg='white',
               activebackground='#d60000',
               activeforeground='white',
               font=db.SmallFont).grid(row=0, column=4, sticky=N)

        types = ('NUMBERS', 'COLORS', 'SKIP')
        db.calib_checks = {}
        for index, name in enumerate(types):
            # print(name, index)
            db.calib_checks[name] = IntVar()
            Checkbutton(master=db.calibration_setup,
                        text=types[index],
                        variable=db.calib_checks[name],
                        font=db.DefaultFont).grid(row=1,
                                                  column=index,
                                                  sticky=W)

        db.set_lang = StringVar()
        db.set_lang.set('English(US) - default')

        lang_options = list(db.languages.keys())

        lang = ttk.Combobox(master=db.calibration_setup,
                            textvariable=db.set_lang,
                            values=lang_options,
                            font=db.DefaultFont)
        lang.grid(row=2, columnspan=3, ipadx=200, pady=50)

        # Add some spacing below the exit button
        db.calibration_setup.grid_rowconfigure(3, weight=1, minsize=150)

        # Step 3: Add a 'Start' Button
        Button(
            master=db.calibration_setup,
            text="Start Test",
            command=start,
            activebackground="blue",
            activeforeground="white",
            bg="white",
            fg="black",
            font=db.DefaultFont,
        ).grid(row=4, columnspan=3, ipadx=200, pady=20)

    except Exception as e:
        s.error_handler(db.calibration_setup, e, 5)

    db.calibration_setup.pack()
Пример #4
0
def create_record(save):
    global file
    print("Identifier entered as:" + db.identifier)
    try:
        if save:
            db.save_folder = s.create_save_path()
            filename = str(db.save_folder) + "mental_arithmetic.txt"
            file = open(filename, "a+")
        else:
            return None
    except Exception as e:
        s.error_handler(db.ma_setup_frame, e, 5)
Пример #5
0
def submit(entry_widget):
    global answer, check_label, file, default_time
    try:
        # raise NotImplementedError("The answer submitter function has not been implemented")
        global num_trials

        num_trials += 1
        submitted = int(entry_widget.get().strip())

        if answer != submitted:
            if num_trials == 1:
                check_label = Label(db.mental_arithmetic_frame,
                                    text="Wrong",
                                    fg='red',
                                    font=db.DefaultFont)
                check_label.grid(row=5, column=0, columnspan=2)
                entry_widget.delete(0, 'end')

            else:
                check_label.config(text="Wrong", fg='red')
                entry_widget.delete(0, 'end')

            if file is not None:
                # if db.var == 1:
                file.write("Wrong,      Time Stamp: {}\n\n".format(
                    round(time.time() - default_time, 2)))
            print("Wrong,      Time Stamp: ",
                  round(time.time() - default_time, 2))
            answer = question()

        else:
            if num_trials == 1:
                check_label = Label(db.mental_arithmetic_frame,
                                    text="Correct",
                                    fg='black',
                                    font=db.DefaultFont)
                check_label.grid(row=5, column=0, columnspan=2)
                entry_widget.delete(0, 'end')
            else:
                check_label.config(text="Correct", fg='black')
                entry_widget.delete(0, 'end')

            if file is not None:
                file.write("Correct,   Time Stamp: {}\n\n".format(
                    round(time.time() - default_time, 2)))
            print("Correct,    Time Stamp: ",
                  round(time.time() - default_time, 2))
            answer = question()

    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 5, 2)
def question():
    try:
        global num_range, mode, question_prompt, answer, default_time, start_time, num_trials

        default_time = time.time()
        db.timer = start_time

        num_trials = 0

        prompt = "Invalid test mode(s) selected"

        number = random.randrange(num_range[0], num_range[1])
        intermediate = 0
        for i in str(number):
            intermediate += int(i)

        a = random.choice(mode)

        if a == 'ADDITION':
            answer = number + intermediate
            prompt = (str(number) + ", + ")
        elif a == 'SUBTRACTION':
            answer = number - intermediate
            prompt = (str(number) + ", - ")
        elif a == 'MULTIPLICATION':
            answer = number * intermediate
            prompt = (str(number) + ", * ")
        elif a == 'DIVISION':
            answer = number // intermediate
            prompt = (str(number) + ", ÷ ")
        else:
            raise Exception(prompt)

        if num_trials == 0:
            question_prompt = Label(db.new_mental_arithmetic_frame, text=prompt, width=45,
                                    bg='orange', font=db.GiantFont)
            question_prompt.grid(row=2, column=0, columnspan=2, ipadx=0, sticky=NW)
            # question_prompt.bind("<Button-1>", s.font_resize)
        else:
            # question_prompt = Label(db.new_mental_arithmetic_frame)
            question_prompt.config(text=prompt)

        db.errorLabel1.grid_forget()
        db.errorLabel2.grid_forget()

        return answer
    except Exception as e:
        s.error_handler(db.new_mental_arithmetic_frame, e, 5)
Пример #7
0
def question():
    try:
        global num_range1, num_range2, mode, question_prompt, answer, default_time, start_time, num_trials

        default_time = time.time()
        db.timer = start_time

        num_trials = 0

        prompt = "Invalid test mode(s) selected"

        number1 = random.randrange(num_range1[0], num_range1[1])
        number2 = random.randrange(num_range2[0], num_range2[1])

        a = random.choice(mode)

        if a == 'ADDITION':
            answer = number1 + number2
            prompt = (str(number1) + " + " + str(number2))
        elif a == 'SUBTRACTION':
            answer = max(number1, number2) - min(number1, number2)
            prompt = (str(max(number1, number2)) + " - " + str(min(number1, number2)))
        elif a == 'MULTIPLICATION':
            answer = number1 * number2
            prompt = (str(number1) + " * " + str(number2))
        elif a == 'DIVISION':
            temp_answer = number1 * number2
            answer = number1
            prompt = (str(temp_answer) + " / " + str(number2))
        else:
            raise Exception(prompt)

        if num_trials == 0:
            # TODO: Make the text fill the width/height of the label
            question_prompt = Label(db.mental_arithmetic_frame, text=prompt, width=45, \
                                    bg='orange', font=db.GiantFont)
            question_prompt.grid(row=2, column=0, columnspan=2, ipadx=0, sticky=NW)
            # question_prompt.bind("<Button-1>", s.font_resize)
        else:
            # question_prompt = Label(db.mental_arithmetic_frame)
            question_prompt.config(text=prompt)

        db.errorLabel1.grid_forget()
        db.errorLabel2.grid_forget()

        return answer
    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 6)
Пример #8
0
def question():
    try:
        global num_range1, num_range2, mode, question_prompt, answer
        # raise NotImplementedError("The question generator function has not been implemented")

        prompt = "Invalid test mode(s) selected"

        number1 = random.randrange(num_range1[0], num_range1[1])
        number2 = random.randrange(num_range2[0], num_range2[1])

        a = random.choice(mode)

        if a == 'ADDITION':
            answer = number1 + number2
            prompt = (str(number1) + " + " + str(number2))
        elif a == 'SUBTRACTION':
            answer = max(number1, number2) - min(number1, number2)
            prompt = (str(max(number1, number2)) + " - " +
                      str(min(number1, number2)))
        elif a == 'MULTIPLICATION':
            answer = number1 * number2
            prompt = (str(number1) + " * " + str(number2))
        elif a == 'DIVISION':
            temp_answer = number1 * number2
            answer = number1
            prompt = (str(temp_answer) + " / " + str(number2))
        else:
            raise Exception(prompt)

        if num_trials == 0:
            question_prompt = Label(db.mental_arithmetic_frame,
                                    text=prompt,
                                    width=45,
                                    bg='orange',
                                    font=db.DefaultFont)
            question_prompt.grid(row=2, column=0, columnspan=2)
        else:
            # question_prompt = Label(db.mental_arithmetic_frame)
            question_prompt.config(text=prompt)

        return answer
    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 5)
Пример #9
0
def question():
    try:
        global answer1, answer2, question_prompt, prev_nums, num_back, default_time, start_time

        default_time = time.time()
        db.timer = start_time

        # Choose the next number
        prompt = random.choice(range(10))

        while prompt in prev_nums:
            prompt = random.choice(range(10))

        if len(prev_nums) > num_back:
            prev_nums.remove(prev_nums[0])
        prev_nums.append(prompt)

        # if len(prev_nums) >= num_back + 1:
        #     prev_nums.remove(prev_nums[0])
        # prev_nums.append(prompt)

        if num_trials == 0:
            # question_prompt = Label(db.nback_frame, text=f"{prompt}, {[prev_nums]}", width=45, bg='orange',
            #                         font=db.HeadingFont)
            question_prompt = Label(db.nback_frame, text=f"{prompt}", width=45, bg='orange',
                                    font=db.HeadingFont)
            question_prompt.grid(row=2, column=0, columnspan=3)
        else:
            question_prompt.config(text=f"{prompt}")

        try:
            db.errorLabel1.grid_forget()
            db.errorLabel2.grid_forget()
        except:
            pass

        return db.pronounce[str(prev_nums[0])], prev_nums[0]

    except Exception as e:
        s.error_handler(db.nback_frame, e, 6, colspan=3)
Пример #10
0
def question():
    # global check_label
    # check_label.grid_forget()
    try:
        global options, question_prompt, answer1, answer2, default_time, start_time

        default_time = time.time()
        db.timer = start_time

        color = random.choice(options)

        if random.random() <= db.congruency_proportion:
            word = random.choice(options).upper()
        else:
            word = color.upper()

        answer1 = db.pronounce[color]
        answer2 = color

        db.errorLabel1.grid_forget()
        db.errorLabel2.grid_forget()

        Label(db.stroop_frame,
              text="",
              width=45,
              bg='white',
              fg=color,
              font=db.HeadingFont).grid(row=3)
        time.sleep(0.00001)
        Label(db.stroop_frame,
              text=word,
              width=45,
              bg='gray',
              fg=color,
              font=db.HeadingFont).grid(row=3)

        return answer1, answer2
    except Exception as e:
        s.error_handler(db.stroop_frame, e, 5)
Пример #11
0
def submit(recognizer, audio):
    global heard, stop_listening
    try:
        try:
            heard.grid_forget()
        except:
            pass
        status.config(text=f"Thinking...")

        submitted = recognizer.recognize_google(audio,
                                                language=f'{db.set_lang}')

        if heard == None:
            heard = Label(db.calibration_frame,
                          text=f"Recorded",
                          font=db.DefaultFont)
        else:
            heard.config(text=f"Recorded")

        heard.grid(row=3, column=0)

        db.pronounce[prompt.cget('text')] = submitted
        print(f"{prompt.cget('text')} : {submitted}")

        if prompt.cget("text") == "skip":
            db.skip_keyword = submitted
            print(f"skip_keyword: {db.skip_keyword}")

        if not len(vals_to_record) == 0:
            question()
        else:
            s.exit_test(db.calibration_frame, stop_listening)

        # question()
    except Exception as e:
        s.error_handler(db.calibration_frame, e, 3)
Пример #12
0
def start():
    # Step 1: Get all the necessary variables
    global selected_difficulty, num_trials, file, label_t, answer1, answer2, \
        default_time, skip_enabled, stop_listening, start_time

    # Step 2: Set up Exception Handling
    try:
        create_record(save=True)  # Create empty save files

        # Step 3: Identify the Difficulty and the Test Types (Addition, Subtraction, etc.)
        selected = []
        for value in list(db.stroop_checks.values()):
            selected.append(value.get())
        selected_difficulty = list(db.stroop_checks.keys())[selected.index(1)]

        if selected_difficulty == "EASY":
            db.congruency_proportion = 0.7
        elif selected_difficulty == "MODERATE":
            db.congruency_proportion = 0.5
        elif selected_difficulty == "HARD":
            db.congruency_proportion = 0.1
        else:
            raise Exception("Please select a difficulty")

    except Exception as e:
        s.error_handler(db.stroop_setup_frame, e, 5, 5)
        return

    try:
        # Step 4: Get rid of the setup screen and start the test
        db.stroop_setup_frame.forget()

        # Step 4b: Add an exit button
        Button(master=db.stroop_frame,
               text="X",
               command=lambda: end_program(db.stroop_frame),
               bg='#a60000',
               fg='white',
               activebackground='#d60000',
               activeforeground='white',
               font=db.DefaultFont).grid(row=0, column=100, sticky=NE)

        num_trials = 0
        answer1, answer2 = question()
        default_time = time.time()
        start_time = round(time.time() - default_time, 2)
        db.timer = start_time

        # Step 5: Start writing test difficulty data to the save files
        if file is not None:
            file.write(selected_difficulty + ' ' + str(selected_difficulty) +
                       '\n')
            file.write("START,     Time Stamp: {}\n".format(start_time))
        print(selected_difficulty)
        print("START,      Time Stamp: ", start_time)

        # Step 6: Add a timer
        label_t = Label(db.stroop_frame, text='0.0', font=db.HeadingFont)
        label_t.grid(row=1, column=0, columnspan=2, pady=50)

        # Step 7: Start listening through microphone
        with db.microphone as source:
            db.recognizer.adjust_for_ambient_noise(source)

        stop_listening = db.recognizer.listen_in_background(
            db.microphone, submit)

        # Step 8: Create instructions label
        Label(db.stroop_frame, text="Say the color of the text", font=db.DefaultFont) \
            .grid(row=4, column=0, columnspan=2)
        # Step 9: Display it all
        db.stroop_frame.pack()

        # Step 10: Endlessly update timer
        while True:
            # put the timer value into the label
            label_t.config(text=str(db.timer))
            # wait for 0.1 seconds
            time.sleep(0.1)
            # needed with time.sleep()
            db.stroop_frame.update()
            # update timer
            db.timer = round(time.time() - default_time, 2)

    except Exception as e:
        s.error_handler(db.stroop_frame, e, 5, display=False)
Пример #13
0
def submit(recognizer, audio):
    global answer1, answer2, check_label, file, default_time, options, num_trials, err_msg

    if num_trials == 1:
        check_label = Label(db.stroop_frame,
                            text="Thinking...",
                            fg='black',
                            font=db.DefaultFont)
        check_label.grid(row=5, column=0, columnspan=2)
    else:
        check_label.config(text="Thinking...", fg='black')

    try:
        # raise NotImplementedError("The answer submitter function has not been implemented")

        num_trials += 1
        try:
            submitted = recognizer.recognize_google(audio)
            print(submitted)
            try:
                assert submitted in options or submitted == db.skip_keyword or submitted in db.pronounce.values()\
                    or answer1 in db.pronounce.values()
            except AssertionError:
                err_msg = "Please say a valid color: Red, Yellow, Blue, or Green"
                raise Exception(err_msg)
        except sr.UnknownValueError:
            err_msg = "Sorry, didn't catch that"
            raise Exception(err_msg)
        except sr.RequestError as e:
            err_msg = f"Could not request results from Google Speech Recognition service; {e}"
            raise Exception(err_msg)

        if err_msg is not None:
            if file is not None:
                file.write(
                    f"Error: {err_msg}, Time Stamp: {round(time.time() - db.global_start_time, 2)}\n\n"
                )

        if submitted == db.skip_keyword:
            message = f"Question Skipped"
            db.errorLabel1.grid_forget()
            db.errorLabel2.grid_forget()

            if num_trials == 1:
                check_label = Label(db.stroop_frame,
                                    text=message,
                                    fg='black',
                                    font=db.DefaultFont)
                check_label.grid(row=5, column=0, columnspan=2)
            else:
                check_label.config(text=message, fg='black')

            if file is not None:
                # if db.var == 1:
                file.write("Skipped, Time Stamp: {}\n\n".format(
                    round(time.time() - db.global_start_time, 2)))
            print("Skipped, Time Stamp: ",
                  round(time.time() - db.global_start_time, 2))
            pass
        else:
            if submitted.lower() not in [answer1.lower(), answer2.lower()]:
                message = f"Wrong"
                db.errorLabel1.grid_forget()
                db.errorLabel2.grid_forget()

                if num_trials == 1:
                    check_label = Label(db.stroop_frame,
                                        text=message,
                                        fg='red',
                                        font=db.DefaultFont)
                    check_label.grid(row=5, column=0, columnspan=2)
                else:
                    check_label.config(text=message, fg='red')

                if file is not None:
                    # if db.var == 1:
                    file.write("Wrong, Time Stamp: {}\n\n".format(
                        round(time.time() - db.global_start_time, 2)))
                print("Wrong, Time Stamp: ",
                      round(time.time() - db.global_start_time, 2))

            else:
                message = f"Correct"
                db.errorLabel1.grid_forget()
                db.errorLabel2.grid_forget()
                if num_trials == 1:
                    check_label = Label(db.stroop_frame,
                                        text=message,
                                        fg='green',
                                        font=db.DefaultFont)
                    check_label.grid(row=5, column=0, columnspan=2)
                else:
                    check_label.config(text=message, fg='green')

                if file is not None:
                    file.write("Correct, Time Stamp: {}\n\n".format(
                        round(time.time() - db.global_start_time, 2)))
                print("Correct, Time Stamp: ",
                      round(time.time() - db.global_start_time, 2))

        answer1, answer2 = question()
        db.stroop_frame.after(2000, check_label.grid_forget)

    except Exception as e:
        s.error_handler(db.stroop_frame, e, 6, 2)
Пример #14
0
def start():
    # Step 1: Get all the necessary variables
    global sec_per_trial, num_back, num_trials, answer1, answer2, stop_listening, default_time, start_time, \
        prev_nums

    # Step 2: Implement Error Checking
    try:
        # raise NotImplementedError("The Start function has not been implemented")
        create_record(save=True)  # Create empty save files

        # Step 3: Identify the Difficulty and the Test Types (1-back, 2-back, etc.)
        selected = []
        for value in list(db.grid_boxes.values()):
            selected.append(value.get())
        selected_difficulty = list(db.grid_boxes.keys())[selected.index(1, 0, 3)]
        selected_type = list(db.grid_boxes.keys())[selected.index(1, 3, 6)]

        if selected_difficulty == "7 sec/trial":
            sec_per_trial = 7
        elif selected_difficulty == "5 sec/trial":
            sec_per_trial = 5
        elif selected_difficulty == "3 sec/trial":
            sec_per_trial = 3
        else:
            raise Exception("Please select a difficulty")

        if selected_type == '1-BACK':
            num_back = 1
        elif selected_type == '2-BACK':
            num_back = 2
        elif selected_type == '3-BACK':
            num_back = 3
        else:
            raise Exception("Please select a type")

    except Exception as e:
        s.error_handler(db.nb_setup_frame, e, 6)

    try:
        # Step 4: Get rid of the setup screen and start the test
        db.nb_setup_frame.forget()
        check_label.grid_forget()
        prev_nums = []

        # Step 4b: Add an exit button
        Button(
            master=db.nback_frame,
            text="X",
            command=lambda: end_program(db.nback_frame),
            bg='#a60000',
            fg='white',
            activebackground='#d60000',
            activeforeground='white',
            font=db.DefaultFont
        ).grid(row=0, column=1, sticky=NE)

        num_trials = 0
        answer1, answer2 = question()
        default_time = time.time()
        start_time = round(time.time() - default_time, 2)
        db.timer = start_time

        # Step 5: Start writing test difficulty data to the save files
        if file is not None:
            file.write(selected_difficulty + ' ' + str(selected_type) + '\n')
            file.write("START,     Time Stamp: {}\n".format(start_time))
        print(selected_difficulty, selected_type)
        print("START,      Time Stamp: ", start_time)

        # Step 6: Add a timer
        label_t = Label(db.nback_frame, text='0.0', font=db.HeadingFont)
        label_t.grid(row=1, column=0, columnspan=3, pady=50)

        # Step 7: Start listening through microphone
        with db.microphone as source:
            db.recognizer.adjust_for_ambient_noise(source)

        stop_listening = db.recognizer.listen_in_background(db.microphone, submit)

        # Step 8: Create instructions label and base grid
        Label(db.nback_frame, text="Listening...", font=db.DefaultFont) \
            .grid(row=4, column=0, columnspan=3, pady=35)

        # Step 9: Display it all
        db.nback_frame.pack()

        # Step 10: Endlessly update timer
        while True:
            # put the timer value into the label
            label_t.config(text=str(db.timer))
            # wait for 0.1 seconds
            time.sleep(0.1)
            # needed with time.sleep()
            db.nback_frame.update()
            # update timer
            db.timer = round(time.time() - default_time, 2)

            if db.timer >= sec_per_trial:
                answer1, answer2 = question()

    except Exception as e:
        s.error_handler(db.nback_frame, e, 6, colspan=3, display=False)
Пример #15
0
def submit(recognizer, audio):
    global answer1, answer2, check_label, file, default_time, num_trials, err_msg

    if num_trials == 1:
        check_label = Label(db.nback_frame, text="Thinking...", fg='black', font=db.DefaultFont)
        check_label.grid(row=7, column=0, columnspan=3)
    else:
        check_label.config(text="Thinking...", fg='black')

    try:
        # raise NotImplementedError("The answer submitter function has not been implemented")

        num_trials += 1
        try:
            submitted = recognizer.recognize_google(audio)
            try:
                # if submitted in db.pronounce.values():
                #     submitted = db.pronounce[str(list(db.pronounce.keys()).index(submitted))]
                if submitted == db.skip_keyword:
                    print("Question Skipped")
                else:
                    submitted = int(submitted)
            except ValueError:
                err_msg = "I can only understand numbers. Please repeat your answer."
                raise Exception(err_msg)
        except sr.UnknownValueError:
            err_msg = "Sorry, didn't catch that"
            raise Exception(err_msg)
        except sr.RequestError as e:
            err_msg = f"Could not request results from Google Speech Recognition service; {e}"
            raise Exception(err_msg)

        if err_msg is not None:
            if file is not None:
                file.write(f"Error: {err_msg}, Time Stamp: {round(time.time() - db.global_start_time, 2)}\n\n")

        check_label.grid_forget()
        if submitted == db.skip_keyword:
            message = "Question Skipped"
            db.errorLabel1.grid_forget()
            db.errorLabel2.grid_forget()

            if num_trials == 1:
                check_label = Label(db.nback_frame, text=message, fg='black', font=db.DefaultFont)
                check_label.grid(row=7, column=0, columnspan=3)
            else:
                check_label.config(text=message, fg='black')

            if file is not None:
                # if db.var == 1:
                file.write("Skipped,{}, Time Stamp: {}\n\n".format(submitted, round(time.time() - db.global_start_time, 2)))
            print(f"Skipped,{submitted} Time Stamp: {round(time.time() - db.global_start_time, 2)}")
            print(prev_nums)
            pass
        else:
            if submitted not in [answer1, answer2]:
                if submitted != db.skip_keyword:
                    message = f"Wrong"
                    db.errorLabel1.grid_forget()
                    db.errorLabel2.grid_forget()
                    check_label.config(text=message, fg='red')
                    check_label.grid(row=7, column=0, columnspan=3)

                    if file is not None:
                        # if db.var == 1:
                        file.write("Wrong,{}, Time Stamp: {}\n\n".format(submitted, round(time.time() - db.global_start_time, 2)))
                    print(f"Wrong,{submitted},{answer1, answer2},Time Stamp: {round(time.time() - db.global_start_time, 2)}")
                else:
                    message = "Question skipped."
                    db.errorLabel1.grid_forget()
                    db.errorLabel2.grid_forget()
                    check_label.config(text=message, fg='black')
                    check_label.grid(row=7, column=0, columnspan=3)


            else:
                message = f"Correct"
                db.errorLabel1.grid_forget()
                db.errorLabel2.grid_forget()
                check_label.config(text=message, fg='green')
                check_label.grid(row=7, column=0, columnspan=3)


                if file is not None:
                    file.write("Correct,{},Time Stamp: {}\n\n".format(submitted, round(time.time() - db.global_start_time, 2)))
                print(f"Correct,{submitted},Time Stamp: {round(time.time() - db.global_start_time, 2)}")

        answer1, answer2 = question()
        db.nback_frame.after(2000, check_label.grid_forget)

    except Exception as e:
        s.error_handler(db.nback_frame, e, 6, colspan=3)
Пример #16
0
def start():
    # Step 1: Get all the necessary variables
    global num_range1, num_range2, selected_difficulty, mode, num_trials, file, label_t, answer, \
        default_time, skip_enabled

    # Step 2: Set up Exception Handling
    try:
        create_record(save=True)  # Create empty save files

        # Step 3: Identify the Difficulty and the Test Types (Addition, Subtraction, etc.)
        selected = []
        for value in list(db.ma_checks.values()):
            selected.append(value.get())
        selected_difficulty = list(db.ma_checks.keys())[selected.index(
            1, 0, 3)]
        if selected[3] == 1: pass_enabled = True

        if selected_difficulty == "EASY":
            num_range1 = [1, 10]
            num_range2 = [1, 10]
        elif selected_difficulty == "MODERATE":
            num_range1 = [11, 50]
            num_range2 = [1, 10]
        elif selected_difficulty == "HARD":
            num_range1 = [11, 100]
            num_range2 = [11, 100]
        else:
            raise Exception("Please select a difficulty")

        mode_indices = np.where(np.isin(selected, 1))[0]
        mode_indices = mode_indices[mode_indices > 3]
        mode = [list(db.ma_checks.keys())[i] for i in mode_indices]

    except Exception as e:
        s.error_handler(db.ma_setup_frame, e, 5, 5)
        return

    try:
        # Step 4: Get rid of the setup screen and start the test
        db.ma_setup_frame.forget()

        # Step 4b: Add an exit button
        Button(
            master=db.mental_arithmetic_frame,
            text="X",
            command=partial(end_program, db.mental_arithmetic_frame),
            bg='#a60000',
            fg='white',
            activebackground='#d60000',
            activeforeground='white',
        ).grid(row=0, column=100, sticky=NE)

        num_trials = 0
        answer = question()
        default_time = time.time()
        start_time = round(time.time() - default_time, 2)
        db.timer = start_time

        # Step 5: Start writing test difficulty data to the save files
        if file is not None:
            file.write(selected_difficulty + ' ' + str(mode) + '\n')
            file.write("START,     Time Stamp: {}\n".format(start_time))
        print(selected_difficulty, mode[0:])
        print("START,      Time Stamp: ", start_time)

        # Step 6: Add a timer
        label_t = Label(db.mental_arithmetic_frame,
                        text='0.0',
                        font=db.HeadingFont)
        label_t.grid(row=1, column=0, columnspan=2, pady=50)

        # Step 7: Create an Entry Widget to allow for answer input
        # TODO: Replace the entry widget with speech recognition
        Label(db.mental_arithmetic_frame, text="Answer:", font=db.DefaultFont) \
            .grid(row=3, column=0, sticky='E', pady=50)
        entry_widget = Entry(db.mental_arithmetic_frame, font=db.DefaultFont)
        entry_widget.bind('<Return>', lambda event: submit(entry_widget))
        entry_widget.grid(row=3, column=1, sticky='W', pady=50)

        # Step 8: Create instructions label
        Label(db.mental_arithmetic_frame, text="Press Enter to submit", font=db.DefaultFont) \
            .grid(row=4, column=0, columnspan=2)
        # Step 9: Display it all
        db.mental_arithmetic_frame.pack()

        # Step 10: Endlessly update timer
        while True:
            # put the timer value into the label
            label_t.config(text=str(db.timer))
            # wait for 0.1 seconds
            time.sleep(0.1)
            # needed with time.sleep()
            db.mental_arithmetic_frame.update()
            # update timer
            db.timer = round(time.time() - default_time, 2)

    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 5, display=False)
Пример #17
0
def start():
    # Step 1: Get all the necessary variables
    global num_range1, num_range2, selected_difficulty, mode, num_trials, file, label_t, answer, \
        default_time, skip_enabled, stop_listening, start_time

    # Step 2: Set up Exception Handling
    try:
        create_record(save=True)  # Create empty save files

        # Step 3: Identify the Difficulty and the Test Types (Addition, Subtraction, etc.)
        selected = []
        for value in list(db.ma_checks.values()):
            selected.append(value.get())
        selected_difficulty = list(db.ma_checks.keys())[selected.index(1, 0, 3)]
        if selected[3] == 1: skip_enabled = True

        if selected_difficulty == "EASY":
            num_range1 = [1, 10]
            num_range2 = [1, 10]
        elif selected_difficulty == "MEDIUM":
            num_range1 = [11, 50]
            num_range2 = [1, 10]
        elif selected_difficulty == "HARD":
            num_range1 = [11, 100]
            num_range2 = [11, 100]
        else:
            raise Exception("Please select a difficulty")

        mode_indices = np.where(np.isin(selected, 1))[0]
        mode_indices = mode_indices[mode_indices > 3]
        mode = [list(db.ma_checks.keys())[i] for i in mode_indices]

    except Exception as e:
        s.error_handler(db.ma_setup_frame, e, 5, 5)
        return

    try:
        # Step 4: Get rid of the setup screen and start the test
        db.ma_setup_frame.forget()

        # Step 4b: Add an exit button
        Button(
            master=db.mental_arithmetic_frame,
            text="X",
            command=lambda: end_program(db.mental_arithmetic_frame),
            bg='#a60000',
            fg='white',
            activebackground='#d60000',
            activeforeground='white',
            font=db.SmallFont
        ).grid(row=0, column=1, sticky=N)

        num_trials = 0
        answer = question()
        default_time = time.time()
        start_time = round(time.time() - default_time, 2)
        db.timer = start_time

        # Step 5: Start writing test difficulty data to the save files
        if file is not None:
            file.write(selected_difficulty + ' ' + str(mode) + '\n')
            file.write("START,     Time Stamp: {}\n".format(start_time))
        print(selected_difficulty, mode[0:])
        print("START,      Time Stamp: ", start_time)

        # Step 6: Add a timer
        label_t = Label(db.mental_arithmetic_frame, text=f'Time:0.0, Attempts: {2 - num_trials}', font=db.HeadingFont)
        label_t.grid(row=1, column=0, columnspan=2, pady=50)

        # Step 7: Start listening through microphone
        with db.microphone as source:
            db.recognizer.adjust_for_ambient_noise(source)

        stop_listening = db.recognizer.listen_in_background(db.microphone, submit)

        # Step 8: Create instructions label
        Label(db.mental_arithmetic_frame, text="Listening...", font=db.DefaultFont) \
            .grid(row=4, column=0, columnspan=2)

        # Step 9: Display it all
        db.mental_arithmetic_frame.pack()

        # Step 10: Endlessly update timer
        while True:
            # put the timer value into the label
            label_t.config(text=f"Time: {db.timer}, Attempts: {2 - num_trials}")
            # wait for 0.1 seconds
            time.sleep(0.1)
            # needed with time.sleep()
            db.mental_arithmetic_frame.update()
            # update timer
            db.timer = round(time.time() - default_time, 2)

    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 6, display=False)
Пример #18
0
def submit(recognizer, audio):
    global answer, check_label, file, default_time, num_trials, err_msg

    if num_trials == 1:
        check_label = Label(db.stroop_frame, text="Thinking...", fg='black', font=db.DefaultFont)
        check_label.grid(row=5, column=0, columnspan=2)
    else:
        check_label.config(text="Thinking...", fg='black')

    try:
        # raise NotImplementedError("The answer submitter function has not been implemented")
        try:
            submitted = recognizer.recognize_google(audio)
            print(submitted)
            try:
                if submitted in pronounce.keys():
                    submitted = pronounce[submitted]
                elif submitted == db.skip_keyword and skip_enabled:
                    pass
                else:
                    submitted = int(submitted)
            except ValueError:
                err_msg = "I can only understand numbers. Please repeat your answer."
                raise Exception(err_msg)
        except sr.UnknownValueError:
            err_msg = "Sorry, didn't catch that"
            raise Exception(err_msg)
        except sr.RequestError as e:
            err_msg = f"Could not request results from Google Speech Recognition service; {e}"
            raise Exception(err_msg)

        if err_msg is not None:
            if file is not None:
                file.write(f"Error: {err_msg}, Time Stamp: {round(time.time() - db.global_start_time, 2)}\n\n")

        check_label.destroy()

        if answer != submitted:
            num_trials += 1
            if submitted != db.skip_keyword:
                message = f"Wrong"
                db.errorLabel1.grid_forget()
                db.errorLabel2.grid_forget()
                check_label = Label(db.mental_arithmetic_frame, text=message, fg='red', font=db.DefaultFont)
                check_label.grid(row=5, column=0, columnspan=2)

                if file is not None:
                    # if db.var == 1:
                    file.write("Wrong,      Time Stamp: {}\n\n".format(round(time.time() - db.global_start_time, 2)))
                print("Wrong,      Time Stamp: ", round(time.time() - db.global_start_time, 2))

                if num_trials >= 2:
                    answer = question()

            else:
                message = f"Question skipped."
                db.errorLabel1.grid_forget()
                db.errorLabel2.grid_forget()
                check_label = Label(db.mental_arithmetic_frame, text=message, fg='black', font=db.DefaultFont)
                check_label.grid(row=5, column=0, columnspan=2)

                if file is not None:
                    file.write(f"Skipped")
                answer = question()

        else:
            message = f"Correct"
            db.errorLabel1.grid_forget()
            db.errorLabel2.grid_forget()
            check_label = Label(db.mental_arithmetic_frame, text=message, fg='green', font=db.DefaultFont)
            check_label.grid(row=5, column=0, columnspan=2)

            if file is not None:
                file.write("Correct,   Time Stamp: {}\n\n".format(round(time.time() - db.global_start_time, 2)))
            print("Correct,    Time Stamp: ", round(time.time() - db.global_start_time, 2))
            answer = question()

        db.mental_arithmetic_frame.after(2000, check_label.grid_forget)

    except Exception as e:
        s.error_handler(db.mental_arithmetic_frame, e, 6, 2)