summaryrefslogtreecommitdiff
path: root/master_thesis/frensch_task.py
diff options
context:
space:
mode:
Diffstat (limited to 'master_thesis/frensch_task.py')
-rw-r--r--master_thesis/frensch_task.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/master_thesis/frensch_task.py b/master_thesis/frensch_task.py
new file mode 100644
index 0000000..0c66254
--- /dev/null
+++ b/master_thesis/frensch_task.py
@@ -0,0 +1,113 @@
+#!/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}")