Zwei Schleifen parallelisieren, Randomisierung von Listeninhalt und Feedback einer Variablen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
FabMue
User
Beiträge: 1
Registriert: Sonntag 17. Februar 2019, 11:57

Hallo liebe Community,
ich beschäftige mich seit zwei Wochen etwas intensiver mit Python. Im Wesentlichen benutze ich aktuell die Entwicklungsumgebung in Psychopy. Bisher habe ich alle meine Fragen mit bestehenden Foreneinträgen klären können, jedoch bin ich nun (vorerst) am Ende meines Lateins angekommen. Ich hoffe, dass ihr mir weiterhelfen könnt. :)
Meine Fragen beziehen sich auf den folgenden Code:

Code: Alles auswählen

from __future__ import unicode_literals, division, print_function
from psychopy import visual, core, logging, event, gui
import os, time, random

#Ordner für Daten anlegen, wenn noch nicht vorhanden
if not os.path.isdir("Daten"):
    os.makedirs("Daten")

#Eingabe ID
Dialog = gui.Dlg(title="Identifikation")
Dialog.addField("ParticipantID:")
Dialog.show()

#wenn 'OK', dann csv-Datei anlegen, wenn 'cancel' abbrechen und nicht anlegen
if Dialog.OK:
    Dateiname = "Daten/%s.csv" % (Dialog.data[0])
    Dateilog = logging.LogFile(f=Dateiname, filemode="w")
else:
    core.quit()

#Spaltenbeschriftung Dateilog
Dateilog.write("Decode_1;Code_1;CorrAnsw;Taste;RZ_ist;richtig_falsch\n")

#Liste für Entschlüsselung
Liste = [{"Decode_1": 1, "Code_1":111, "CorrAnsw": "a"},
            {"Decode_1": 2, "Code_1":222, "CorrAnsw": "b"},
            {"Decode_1": 3, "Code_1":333, "CorrAnsw": "c"},
            {"Decode_1": 4, "Code_1":444, "CorrAnsw": "d"}]

win = visual.Window(size=[800, 800], color="white", fullscr=True)
text0 = visual.TextStim(win, text="", color="black")
Reaktionszeit = core.Clock()

#Maus in 'win' unsichtbar
Maus_disabled = event.Mouse(win)
Maus_disabled.setVisible(False)

# (1) Countdown: Dieser Countdown sollte parallel mit der nächsten For-Schleife "for Listeninhalt in Liste" laufen.
#Sobald der Countdown abgelaufen ist, soll auch die For-Schleife "for Listeninhalt in Liste" stoppen und zur Feedbackseite springen.
seconds = int(5)

for i in range(seconds):
                    time_left = str(seconds - i)
                    time.sleep(1)
                    text=visual.TextStim(win,
                            text=(str(time_left +" seconds remain")),
                            color=[-1,-1,-1],
                            bold=True)
                    text.draw()
                    win.flip()
text=visual.TextStim(win, text=("""Zeit abgelaufen"""), color=[-1,-1,-1], bold=True, italic=True)
text.draw()
win.flip()
core.wait(2)

for Listeninhalt in Liste:

    #text=visual.TextStim(win, text=Listeninhalt["Code_1"], color=[-1,-1,-1], pos=(0,-0.2), units="norm")
    #(2) randomisierte Ziehung aus Liste ist bisher nicht möglich.
    text0.setText(Listeninhalt["Code_1"])
    text0.setHeight(0.1)
    text=visual.TextStim(win, text=("""a=111, b=222, c=333, d=444"""), color=[-1,-1,-1], pos=(0,-0.5), units="norm")
    text1=visual.TextStim(win, text=("""Entschlüsseln Sie die Zahl mithilfe des unten angegeben Schemas und drücken Sie die entsprechende Taste!"""), color=[-1,-1,-1], pos=(0,0.5), units="norm")
    
    text0.draw()
    text.draw()
    text1.draw()
    win.flip()
    Reaktionszeit.reset()

    Taste = event.waitKeys(keyList=["a","b","c","d"])
    RZ_ist = Reaktionszeit.getTime()

    if Taste:
        if Taste[0] == Listeninhalt["CorrAnsw"]:
            text0.setText("Richtig!")
            text0.setColor("black")
            richtig_falsch = 1
        else:
            text0.setText("Falsch!")
            text0.setColor("black")
            richtig_falsch = 0

    text0.draw()
    text.draw()
    text1.draw()
    win.flip()
    core.wait(.5)

    #Informationen werden in Dateilog geschrieben
    Dateilog.write("%d;%.1f;%s;%s;%s;%s\n" % (Listeninhalt["Decode_1"], Listeninhalt["Code_1"], Listeninhalt["CorrAnsw"], Taste[0], RZ_ist, richtig_falsch))

#(3) Feedbackseite: Auf dieser Seite sollte die richtige Anzahl der entschlüsselten Decodes stehen.
text2=visual.TextStim(win, text=("""Sie haben ## Zahlen richtig entschlüsselt! Um die Studie zu beenden drücken Sie die Leertaste."""), color=[-1,-1,-1])

text2.draw()
win.flip()
event.waitKeys(keyList=["space"])
win.close()
core.quit()
Bei dem Code handelt es sich um eine einfache Entschlüsselungsaufgabe, bei welcher eine Zahlensequenz durch Tastendruck in ein Buchstaben umgewandelt werden soll. Die Antworten (Gedrückte Taste, Richtige Antwort, Reaktionszeit usw.) werden hierfür in einer csv-Datei gespeichert. Ich habe meine Fragen im Code mit (1), (2) und (3) gekennzeichnet.

Zu (1): Ich möchte gerne, dass während der Entschlüsselung ein Countdown sichtbar im Fenster läuft. Sobald der Countdown abgelaufen ist, endet auch die Entschlüsselungsaufgabe. Bisher habe ich es nur hinbekommen, die For-Schleife des Countdowns sequentiell von der For-Schleife der Entschlüsselungsaufgabe laufen zu lassen. Ich habe schon sehr viel mit herum experimentiert und die For-Schleifen unterschiedlich angeordnet und ineinander verschachtelt, jedoch bisher ohne Erfolg.

Zu (2): Aktuell werden alle Einträge [Code_1] aus der Liste in chronologischer Reihenfolge gezogen. Dies macht die Aufgabe bisher recht vorhersehbar. Gerne würde ich die Zahlenabfolge randomisieren und das Ziehen der Zahlen aus der Liste soll erst dann beendet sein, wenn der Countdown beendet ist. Bisher stoppt die For-Schleife der Entschlüsselungsaufgabe, sobald jede Zahlenabfolge einmal gezogen worden ist.

Zu (3): Nach Ablauf des Countdown soll auf der Feedbackseite die Anzahl der korrekt gelösten Entschlüsselungsaufgaben sichtbar sein. Hierfür müsste irgendwie die Variable "richtig_falsch" aus der csv-Datei auslesen können und die Summe aller Einsen als Anzahl wiedergeben.

Vielleicht hat ja jemand von Euch einen Lösungsansatz zu einer der drei Fragen. Vielen Dank fürs Grübeln und einen schönen Sonntag! :)
Antworten