Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bind et wxPython

4 réponses
Avatar
j.cormouls
Bonjour,

J'ai =E9crit un petit programme dans lequel d=E9filent automatiquement des
pages, et toutes les deux pages, l'utilisateur diit r=E9pondre =E0 une
question en tapant un chiffre de 1 =E0 9...

j'utilise donc :
self.Bind(wx.EVT_KEY_DOWN,self.touche)

pour saisir et v=E9rifier l'entr=E9e utilisateur.

Mon probl=E8me est que si l'utilisateur appuie sur le clavier avant
l'affichage de la question, chaque touche appuy=E9e est gard=E9e en
m=E9moire et est donc prise en compte =E0 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=E9s de la m=E9thode Bind...

Merci de votre aide

JC

4 réponses

Avatar
Amaury Forgeot d'Arc
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

Avatar
jean-michel bain-cornu
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.

Avatar
Jerome
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

Avatar
jean-michel bain-cornu
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.