Partage
  • Partager sur Facebook
  • Partager sur Twitter

[tkinter] event et wait_variable

Et production d'un bip multiplateforme

Sujet résolu
    14 mai 2013 à 10:35:40

    Sujet principal :

    Bonjour à tous,

    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

    • Partager sur Facebook
    • Partager sur Twitter
    Les réseaux de neurones, c'est top cool. Violoniste et webmaster du groupe Euski. BrianSimulator, ou comment réfuter l'expression "RTFM".
      14 mai 2013 à 11:46:45

      Problèmes réglés !

      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()

      • Partager sur Facebook
      • Partager sur Twitter
      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.
      • Editeur
      • Markdown