Timeline demo#
For the full set of experiment files, see demos/features/timeline in the GitHub repository.
# pylint: disable=missing-class-docstring,missing-function-docstring
import random
import psynet.experiment
from psynet.modular_page import (
ModularPage,
PushButtonControl,
DropdownControl
)
from psynet.page import InfoPage
from psynet.timeline import Timeline, PageMaker, CodeBlock, while_loop, switch, join, conditional, for_loop
def get_timeline():
return Timeline(
ModularPage(
"color",
"What is your favorite color?",
PushButtonControl(choices=["red", "green", "blue"]),
time_estimate=10,
save_answer="favorite_color",
),
PageMaker(
lambda participant: InfoPage(
f"OK, your favorite color is {participant.var.favorite_color}."
),
time_estimate=5,
),
CodeBlock(
lambda participant: participant.var.set(
"random_number",
random.randint(0, 100),
)
),
PageMaker(
lambda participant: InfoPage(
f"Your random number is {participant.var.random_number}",
),
time_estimate=5,
),
ModularPage(
"choose_page",
"Which page do you want to see next?",
PushButtonControl(choices=["page_1", "page_2", "page_3"]),
save_answer="choose_page",
time_estimate=5,
),
switch(
"choose_page",
lambda participant: participant.var.choose_page,
{
"page_1": InfoPage("page_1", time_estimate=5),
"page_2": InfoPage("page_2", time_estimate=5),
"page_3": InfoPage("page_3", time_estimate=5),
}
),
while_loop(
"my_loop",
condition=lambda participant: participant.var.get("score", default=0) <= 5,
logic=join(
CodeBlock(lambda participant: participant.var.set("score", random.randint(1, 10))),
conditional(
"feedback",
condition=lambda participant: participant.var.score <= 5,
logic_if_true=PageMaker(
lambda participant: InfoPage(
f"You scored {participant.var.score}, bad luck."
),
time_estimate=5
),
logic_if_false=PageMaker(
lambda participant: InfoPage(
f"You scored {participant.var.score}, well done!",
),
time_estimate=5
),
)
),
expected_repetitions=2,
),
ModularPage(
"target_number",
"What number would you like to count up to?",
DropdownControl([1, 2, 3, 4, 5]),
time_estimate=5,
save_answer="target_number",
),
for_loop(
label="counting",
iterate_over=lambda participant: list(range(1, participant.var.target_number + 1)),
logic=lambda x: InfoPage(str(x), time_estimate=5),
time_estimate_per_iteration=5,
expected_repetitions=3,
),
)
class Exp(psynet.experiment.Experiment):
timeline = get_timeline()