from psychopy import visual, event import time import csv import random from psychopy import gui # Creazione della finestra di PsychoPy win = visual.Window(size=(1024, 768), fullscr=True, screen=0, winType='pyglet', color='black') # Definizione delle dimensioni dello schermo screen_width, screen_height = win.size # Lista per l'ordine delle linee cliccate order_of_clicks = [] # Creazione del testo di benvenuto welcome_text = visual.TextStim(win, text="Benvenuto/a, ..", pos=(0, 0), color='white',height=0.11) # Disegno degli elementi nella finestra di PsychoPy welcome_text.draw() win.flip() # Attendi l'input dell'utente per iniziare l'esperimento event.waitKeys(keyList=['space']) # Calcolo delle dimensioni del box in base alle dimensioni dello schermo box_width = screen_width * 0.9 box_height = screen_height * 0.1 # Posizione del box box_pos = (0, -screen_height / 2 + box_height / 2) # Creazione del box per le linee rettangolari box = visual.Rect(win, width=box_width, height=box_height, pos=box_pos, lineColor='white') # Definizione dei colori e delle posizioni delle linee rettangolari colors = {'A': 'red', 'B': 'green', 'C': 'blue', 'D': 'pink', 'E': 'orange', 'H': 'yellow', 'I': 'cyan', 'J': 'darkgray'} positions = {'A': (-0.45, -0.55),'B': (-0.35, -0.55),'C': (-0.25, -0.55), 'H': (-0.15, -0.55), 'I': (-0.05, -0.55), 'D': (0.05, -0.55), 'J': (0.15, -0.55), 'E': (0.25, -0.55), 'F': (0.35, -0.55), 'G': (0.45, -0.55)} # Creazione delle linee rettangolari rectangles = {} rect_width = 0.01 rect_height = 0.12 for key, color in colors.items(): rectangle = visual.Rect(win, width=rect_width, height=rect_height, pos=positions[key], fillColor=color) rectangles[key] = rectangle # Creazione del box per le linee box_width = 1.8 box_height = 0.15 box_pos = (0, -0.55) box = visual.Rect(win, width=box_width, height=box_height, pos=box_pos, lineColor='white') # Valori numerici associati al box min_value = 0 max_value = 90 current_value = None # Etichette numeriche label_pos = [] for i in range(19): value = min_value + i * 5 label_x = box_pos[0] - box_width / 2 + box_width / 18 * i label_y = box_pos[1] - box_height / 2 - 0.11 label = visual.TextStim(win, text=str(value), pos=(label_x, label_y), color='white') label_pos.append(label) # Definizione delle linee numeriche lines = [] line_positions = [] for i in range(19): line_x = box_pos[0] - box_width / 2 + box_width / 18 * i line_y1 = box_pos[1] - box_height / 2 - 0.001 line_y2 = box_pos[1] - box_height / 2 - 0.07 line = visual.Line(win, start=(line_x, line_y1), end=(line_x, line_y2), lineColor='white', lineWidth=4.0) lines.append(line) line_positions.append((line_x, line_y1)) # Movimento delle linee rettangolari con il mouse mouse = event.Mouse(win=win) selected_rectangle = None # Inizializzazione delle variabili per il salvataggio dei dati order_of_clicks = [] start_time = time.time() end_time = None line_values = {} # Definizione degli elementi testo texts = [',,', ',,,', ',,,',] random.shuffle(texts) # Definizione delle coordinate dei testi in modo casuale text_positions = [(0.45, 0.7), (0.45, 0.56), (0.45, 0.42), (0.45, 0.28), (-0.45, 0.7), (-0.45, 0.56), (-0.45, 0.42), (-0.45, 0.28)] # Definizione dei colori casuali text_colors = ['red', 'green', 'blue', 'yellow', 'orange', 'cyan', 'pink', 'darkgray'] random.shuffle(text_colors) # Creazione degli oggetti TextStim per i testi text_stimuli = [] for i, text in enumerate(texts): text_stim = visual.TextStim(win, text=text, pos=text_positions[i], color=text_colors[i]) text_stimuli.append(text_stim) # Loop principale while True: # Disegno degli elementi nella finestra di PsychoPy box.draw() for rectangle in rectangles.values(): rectangle.draw() for label in label_pos: label.draw() for line in lines: line.draw() for text_stim in text_stimuli: text_stim.draw() win.flip() # Attendi l'input dell'utente keys = event.getKeys() if 'escape' in keys: # L'utente ha premuto il tasto ESC, esci dal loop principale break # Verifica gli eventi del mouse if mouse.getPressed()[0]: if selected_rectangle is None: # Nessuna linea è stata selezionata, controlla se il mouse è sopra un rettangolo for key, rectangle in rectangles.items(): if rectangle.contains(mouse): selected_rectangle = rectangle selected_line = key order_of_clicks.append(key) current_value = None break else: # Una linea è già stata selezionata, sposta la linea rettangolare in base al movimento del mouse all'interno del box mouse_x, _ = mouse.getPos() min_x = box_pos[0] - box_width / 2 + selected_rectangle.width / 2 max_x = box_pos[0] + box_width / 2 - selected_rectangle.width / 2 selected_rectangle.pos = (min(max_x, max(min_x, mouse_x)), selected_rectangle.pos[1]) if selected_rectangle is not None and not mouse.getPressed()[0]: # Il mouse non è più premuto, posiziona la linea rettangolare nel punto desiderato # Aggiorna il valore numerico associato al box relative_position = (selected_rectangle.pos[0] - min_x) / (max_x - min_x) current_value = min_value + relative_position * (max_value - min_value) print(f"Valore attuale: {current_value}") # Deseleziona la linea rettangolare selected_rectangle = None if current_value is not None: # Salva il valore associato alla linea nel dizionario line_values[selected_line] = {'line_value': current_value, 'color': colors[selected_line]} # Calcolo del tempo totale dell'esperimento end_time = time.time() total_time = end_time - start_time # Salvataggio dei dati su un file CSV output_filename = f"n°_nameofexperiment.csv" with open(output_filename, "w", newline="") as csvfile: writer = csv.writer(csvfile) # Scrittura dell'intestazione del file CSV writer.writerow(["Line", "Value", "Color", "Text"]) # Scrittura dei dati delle linee nel file CSV for line, data in line_values.items(): text_associated = None for i, text in enumerate(texts): if text_colors[i] == data['color']: text_associated = text break writer.writerow([line, data['line_value'], data['color'], text_associated])