|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
J'ai écrit un petit programme dans lequel défilent automatiquement des pages, et toutes les deux pages, l'utilisateur diit répondre à une question en tapant un chiffre de 1 à 9... j'utilise donc : self.Bind(wx.EVT_KEY_DOWN,self.touche) pour saisir et vérifier l'entrée utilisateur. Mon problème est que si l'utilisateur appuie sur le clavier avant l'affichage de la question, chaque touche appuyée est gardée en mémoire et est donc prise en compte à l''affichage de la question. Comment faire en sorte que la saisie ne soit possible qu'au moment opportun. (Annulation de Bind? je n'y arrive pas). Je pense n'avoir pas saisi les subtilités de la méthode Bind... Merci de votre aide JC |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
j.cormouls@neuf.fr a écrit :
> Bonjour, > > J'ai écrit un petit programme dans lequel défilent automatiquement des > pages, et toutes les deux pages, l'utilisateur diit répondre à une > question en tapant un chiffre de 1 à 9... > > j'utilise donc : > self.Bind(wx.EVT_KEY_DOWN,self.touche) > > pour saisir et vérifier l'entrée utilisateur. > > Mon problème est que si l'utilisateur appuie sur le clavier avant > l'affichage de la question, chaque touche appuyée est gardée en > mémoire et est donc prise en compte à l''affichage de la question. > > Comment faire en sorte que la saisie ne soit possible qu'au moment > opportun. > (Annulation de Bind? je n'y arrive pas). > Je pense n'avoir pas saisi les subtilités de la méthode Bind... Je tenterais de mettre un appel à wx.Yield() juste avant le Bind. Ainsi on donne une chance au système d'épuiser le tampon clavier. -- Amaury |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Bonjour,
> Comment faire en sorte que la saisie ne soit possible qu'au moment > opportun. S'il est correct de penser que ton programme n'a plus rien à faire au moment de la saisie, peut-être peux-tu utiliser OnIdle (exemple : monObjet.Bind(wx.EVT_IDLE,maMethode) ) pour positionner un indicateur que tu vas tester dans self.touche. Exemple non testé (désolé, pas assez de batterie): self.Bind(wx.EVT_IDLE,self.OnIdle) ... def OnIdle(self,event): self.indic= True # la prochaine touche sera la bonne, les touches bufferisées ont déjà été traitées à ce stade def touche(self,event): if self.indic == True: *** traitement, après vidage du buffer clavier *** self.indic= False Ainsi, le traitement ne peut se déclencher que lorsque tous les événements bufferisés ont été traités, par déclenchement de self.touche dans ton cas. Ceci devrait provoquer un vidage du buffer clavier, sur lequel je ne crois pas que tu aies la main avec wx, sauf erreur bien entendu. > Je pense n'avoir pas saisi les subtilités de la méthode Bind... Je ne crois pas que ce soit bin bin fin : tu fais correspondre une méthode à un événement, dont l'activation provoquera l'éxécution de cette méthode. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
j.cormouls@neuf.fr wrote:
> Bonjour, > > J'ai écrit un petit programme dans lequel défilent automatiquement des > pages, et toutes les deux pages, l'utilisateur diit répondre à une > question en tapant un chiffre de 1 à 9... > > j'utilise donc : > self.Bind(wx.EVT_KEY_DOWN,self.touche) > > pour saisir et vérifier l'entrée utilisateur. > > Mon problème est que si l'utilisateur appuie sur le clavier avant > l'affichage de la question, chaque touche appuyée est gardée en > mémoire et est donc prise en compte à l''affichage de la question. > > Comment faire en sorte que la saisie ne soit possible qu'au moment > opportun. > (Annulation de Bind? je n'y arrive pas). > Je pense n'avoir pas saisi les subtilités de la méthode Bind... > > Merci de votre aide > > JC > Bonjour, Quel est l'intérêt de capturer les événements clavier de cette façon ? J'ai l'impression que ton problème vient justement du fait que tu n'as pas à l'utiliser de cette façon. En lisant tes besoins, je pencherai plus pour un pseudo-code comme ceci : tantque pas findeprogramme faire faire défiler page si page affichée demande question alors poser question attendre réponse traiter réponse finsi fintantque Ca me semble un traitement purement séquentiel avec une partie "modale" pour l'interaction avec l'utilisateur, ce n'est pas un traitement événementiel. A la limite tu peux lancer un événement lorsque la page qui demande un choix de l'utilisateur est affichée et récupérer cet événement à ce moment là. Jérôme |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
> En lisant tes besoins, je pencherai plus pour un pseudo-code comme ceci :
> > tantque pas findeprogramme faire > faire défiler page > si page affichée demande question alors > poser question > attendre réponse > traiter réponse > finsi > fintantque > > Ca me semble un traitement purement séquentiel avec une partie "modale" > pour l'interaction avec l'utilisateur, ce n'est pas un traitement > événementiel. A la limite tu peux lancer un événement lorsque la page > qui demande un choix de l'utilisateur est affichée et récupérer cet > événement à ce moment là. Sauf que si tu fais ça et que l'opérateur envoie des évènements claviers pendant l'affichage, les touches seront mise en tampon avant traitement, et c'est ce que ne veux pas notre ami. Dans la phase "attendre réponse", tu vas récupérer tous les caractères frappés pendant la phase "faire défiler". C'est ce qui impose un vidage du buffer avant traitement, sinon c'est la pagaille. |
|
![]() |
| Outils de la discussion | |
|
|