Je suis en train de créer un programme pour passer une expérience de détection visuelle, et je me heurte à un petit soucis... En clair, quand un stimulus arrive à l'écran, l'utilisateur doit au plus vite appuyer sur une touche quelconque pour dire qu'il l'a détecté. À ce moment, je récupère le temps qu'il y a eu entre l'apparition et la détection du stimulus. J'ai donc utilisé la méthode wait_variable des widgets tkinter, couplée à un binding sur une touche quelconque du clavier :
import tkinter as tk
import time as T
import random as R
Press = tk.StringVar()
# ------------------------------------------------------------------------------
def stim1():
"Computing first experiment"
global fix_cross, sq_stim, Press
res = []
for i in range(12):
Press.set('')
# bip
T.sleep(R.random()+0.5)
tint(sq_stim)
tic = T.time()
root[0].wait_variable(Press)
tk.waitvar()
res.append(T.time()-tic)
tint(fix_cross)
T.sleep(R.random()+1)
return res
# ------------------------------------------------------------------------------
def key_press(char):
global Press
Press.set(char)
# ------------------------------------------------------------------------------
def main():
"""main program of the experiment"""
root = {0:tk.Tk()}
# ...
# Binding stimulus-response keys
root[0].bind('<Key>', lambda e:key_press(e.char))
# Launching fisrt experiment, giving instructions
tkMB.showinfo('Première tache','Instructions.')
T.sleep(3)
r1 = stim1()
Le soucis est que mon programme effectue bien les actions demandées, à savoir afficher le stimulus après avoir attendu un certain temps. Ensuite, le binding fonctionne bien (si je mets un petit print(char) dans ma fonction key_press, le caractère correspondant s'affiche bien en console). En revanche, le wait_variable ne détecte pas la mise à jour de la variable Press...
P.S. : je sais bien que vous allez me dire que l'usage de variables globales n'est pas très bon, qu'il vaut mieux passer les variables dont on a besoin en paramètre, mais vu que je ne travaille que sur un fichier et que ce n'est que pour montrer, dans le cadre de mon TER, ce que serait l'expérience, j'estime ça suffisant...
Sujet secondaire :
Je cherche également une méthode pour produire un bip classique, à la place du commentaire correspondant, qui soit multiplateforme et qui marche. J'ai déjà tenté le print('\a') et son homologue avec le module sys, sans pour autant que mon ordinateur n'émette le moindre son. Cela vient peut-être de la configuration de python chez moi ? Autrement, je suis preneur d'une autre façon de produire un bip simple !
- Edité par respatte 14 mai 2013 à 10:52:23
Les réseaux de neurones, c'est top cool. Violoniste et webmaster du groupe Euski. BrianSimulator, ou comment réfuter l'expression "RTFM".
Problème 1 : il fallait en fait forcer la mise à jour de l'affichage par tkinter, autrement il entre directement dans le T.sleep(). La méthode à utiliser était donc root[0].update()
Problème 2 : il existe une méthode tkinter assez peu connue apparemment, puisque je l'ai trouvée par hasard en cherchant une façon de forcer la mise à jour : root[0].bell()
Les réseaux de neurones, c'est top cool. Violoniste et webmaster du groupe Euski. BrianSimulator, ou comment réfuter l'expression "RTFM".
[tkinter] event et wait_variable
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.