Bind et wxPython

Le
j.cormouls
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Amaury Forgeot d'Arc
Le #645150
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

jean-michel bain-cornu
Le #644915
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.

Jerome
Le #644913
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

jean-michel bain-cornu
Le #644912
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.

Publicité
Poster une réponse
Anonyme