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()
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()
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()
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)