#!/usr/bin/env python3 from __future__ import annotations from psychopy import constants, core, event, gui, visual from collections import namedtuple DisplayVariable = namedtuple("DisplayVariable", ["name", "values"]) DisplayProcedure = namedtuple("DisplayProcedure", ["procedure", "solution"]) def experiment_shutdown(): WIN.close() core.quit() WIN = visual.Window((800, 600), fullscr=True, units="pix") MONITOR_FPS = 60 # Cancel experiment anytime with Esc event.globalKeys.add(key="escape", func=experiment_shutdown, name="shutdown") def generate_variable_display(varx: list[DisplayVariable], x_positions: list[int]): assert len(varx) == len(x_positions) stims = [] def gen_value_stims(values, x, y, offset): for value in values: y -= offset value_stim = visual.TextBox2( WIN, pos=(x, y), text=value, # size=200, letterHeight=100, alignment="center", ) stims.append(value_stim) y = 400 offset = 100 for var, x_pos in zip(varx, x_positions): stim_var = visual.TextBox2( WIN, pos=[x_pos, y], text=var.name, # size=[1000, 1000], letterHeight=50, alignment="center", ) stims.append(stim_var) gen_value_stims(var.values, x_pos, y, offset) return stims def generate_procedure_display(procedure: DisplayProcedure): stim_procedure = visual.TextBox2( WIN, pos=[-600, -200], text=procedure.procedure, # size=[1000, 1000], letterHeight=50, alignment="center", ) return stim_procedure solid = DisplayVariable("SOLID", [6]) algae = DisplayVariable("ALGAE", [8]) lime = DisplayVariable("LIME", [3, 5, 1, 9]) toxin = DisplayVariable("TOXIN", [4, 8, 7, 2]) x_positions = [-600, -300, 0, 300] # x_positions = [-600, -300] stims = generate_variable_display([solid, algae, lime, toxin], x_positions) p1 = DisplayProcedure("Index 1 = Solid * (Lime_4 - Lime_2) = ", 1) p1 = generate_procedure_display(p1) stims.append(p1) stim_answer_box = visual.TextBox2( WIN, "", letterHeight=50, pos=(0, -200), size=[150, 70], editable=True, fillColor="white", color="black", alignment="center", ) stims.append(stim_answer_box) not_finished = True answer = "not answered" while not_finished: stim_answer_box.hasFocus = True for stim in stims: stim.draw() WIN.flip() answer = stim_answer_box.text if "\n" in stim_answer_box.text: not_finished = False event.waitKeys(keyList=["space"]) print(f"Answer: {answer}")