IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Détection touches clavier : problème 'Shift' + 'touche du pavé numérique'


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut Détection touches clavier : problème 'Shift' + 'touche du pavé numérique'
    Bonjour,

    J'ai encore un problème avec la détection d'une touche du clavier concernant les touches du pavé numérique associées à la touche 'Shift' pour le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from tkinter import *
     
    flag = 'abc'
     
    #L'appui prolongé sur une touche du clavier appelle plusieurs fois l'évenement
    #La variable "flag" permet d'intercepter le 1er évenement
    def Appui(event):
        global flag
     
        flagTest = event.keysym
     
        if flag != flagTest:
            flag = flagTest
            print ("appui    : touche=",event.keysym)
     
        return 'break'
     
     
    def Relache(event):
        global flag, temps
     
        print ("relache  : touche=",event.keysym)
        print('')
     
        flag = 'abc'
     
     
    Ecran = Tk()
     
    Ecran.bind("<KeyPress>", Appui)
     
    Ecran.bind("<KeyRelease>", Relache)
     
    Ecran.mainloop()
    Lorsque j'effectue la série d'évènements suivants :

    - appui sur 'Shift' (appui maintenu sur'Shift')
    - appui sur 'k' (en maintenant l'appui sur 'Shift')
    - relache de 'k' (en maintenant l'appui sur 'Shift')
    - relache de 'Shift'

    alors le code renvoie, de façon logique, les résultats :

    appui : touche= Shift_L
    appui : touche= K
    relache : touche= K
    relache : touche= Shift_L


    Cependant, Lorsque j'effectue la même série d'évènements (mais en remplaçant 'k' par '3') :

    - appui sur 'Shift' (appui maintenu sur'Shift')
    - appui sur '3' du pavé numérique (en maintenant l'appui sur 'Shift')
    - relache de '3' du pavé numérique (en maintenant l'appui sur 'Shift')
    - relache de 'Shift'

    alors, voici les résultats que retourne le code :

    appui : touche= Shift_L
    relache : touche= Shift_L

    appui : touche= Next
    relache : touche= Next

    appui : touche= Shift_L
    relache : touche= Shift_L

    Le problème rencontré est le suivant : pourquoi, tout en maintenant le 'Shift', le fait d'enfoncer la touche '3' (du pavé) entraîne comme résultat (immédiatement après) la 'relache de la touche Shift' et non la détection de l'appui sur la touche '3' ? et comment peut-on faire en sorte que ce soit la touche '3' qui soit repérée en appui plutôt que la touche 'Shift' en relache ?

    Auriez-vous une idée de ce qu'il se passe et comment y remédier ?

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour sancho.poncho,

    Je n'avais pas vu ce post.

    Encore à se battre avec Windows ?
    Essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from ctypes import windll
     
     
    def Appui(event):
        print ("appui    : touche=", event.keysym)
        if event.keysym.startswith("Shift"):
            scan = windll.user32.MapVirtualKeyA(144, 0) # 144 = Numlook
            windll.user32.keybd_event(144, scan, 0, 0)
    @+

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Ou plutôt un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from ctypes import windll
     
    scan = windll.user32.MapVirtualKeyA(144, 0) # 144 = Numlook
     
    def Appui(event):
        print ("appui    : touche=", event.keysym)
        if event.keysym.startswith("Shift"):
            windll.user32.keybd_event(144, scan, 0, 0)
            windll.user32.keybd_event(144, scan, 1, 0)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    Bonjour PauseKawa,

    et heureux de vous relire !

    J'ai essayé d'intégrer votre code au mien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    from ctypes import windll
    from tkinter import *
     
    flag = 'abc'
     
     
    #L'appui prolongé sur une touche du clavier appelle plusieurs fois l'évenement
    #La variable "flag" permet d'intercepter le 1er évenement
    def Appui(event):
        global flag
     
        flagTest = event.keysym
     
        if flag != flagTest:
            if event.keysym.startswith("Shift"):
                windll.user32.keybd_event(144, scan, 0, 0)
                windll.user32.keybd_event(144, scan, 1, 0)
            flag = flagTest
            print ("appui    : touche=",event.keysym)
     
        return 'break'
     
     
    def Relache(event):
        global flag, temps
     
        print ("relache  : touche=",event.keysym)
        print('')
     
        flag = 'abc'
     
     
    Ecran = Tk()
     
    scan = windll.user32.MapVirtualKeyA(144, 0) # 144 = Numlook
     
    Ecran.bind("<KeyPress>", Appui)
     
    Ecran.bind("<KeyRelease>", Relache)
     
    Ecran.mainloop()
    ... mais il persiste un problème : lorsque je relache la touche 'Shift' et que j'appuie sur un chiffre du pavé numérique, par exemple '1' alors j'obtiens 'End' comme réponse car 'Num_Lock' est désactivée semble t-il.

    J'ai essayé de voir sur le net comment fonctionnait ".keybd_event()" mais je n'y suis pas arrivé.

    J'aurais deux questions, si vous avez un peu de temps ? :
    - comment réactiver la touche 'Num_Lock' 'en relache' après l'avoir désactivée 'en appui' ?
    - que signifie les chiffres '0' et '1' dans l'expression "windll.user32.keybd_event(144, scan, 1, 0)"

    @ plus tard PauseKawa

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                windll.user32.keybd_event(144, scan, 0, 0)  # 0 Touche 144 (Numlook) appuyée
                windll.user32.keybd_event(144, scan, 1, 0)  # 1 Touche Relâchée
    Il suffit de refaire la séquence pour avoir les chiffres du pavé numérique.

    @+

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    J'allais oublier:

    Citation Envoyé par sancho.poncho Voir le message
    J'ai essayé de voir sur le net comment fonctionnait ".keybd_event()" mais je n'y suis pas arrivé.
    La doc, direct à la source...

    @+

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    Merci pour votre réponse PauseKawa même si je n'arrive pas vraiment à réactiver la touche 'Num_Lock' après sa désactivation

    Mais l'essentiel est d'avoir l'information : à force j'y arriverai.

    Sinon, pour la doc, j'ai cherché le fonctionnement de "keybd_event" en précisant "pour python" et j'avoue ne pas avoir pensé à chercher "pour C++".

    En tout cas, je vous remercie beaucoup pour votre aide et les informations que vous m'avez fournis car il est certain que je n'aurais pas trouver cela sans vous.

    Je vous souhaite une très bonne soirée PauseKawa et au plaisir !

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    shift 3 n'existe simplement pas.
    Le verrouillage numérique est un shift permanent sur le pavé numérique. Donc appuyer sur shift annule le verrouillage clavier. Quelle est la valeur normale de cette touche ? "Page suivante". Donc ta moulinette indique "next" que j'interprète comme "page suivante".

    Si tu tiens absolument à détecter cette combinaison de touche, i l te reste à chercher le code de "page suivante"

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    Le verrouillage numérique est un shift permanent sur le pavé numérique.
    Je vous remercie pour cette information Flodelarab.

    Le problème maintenant c'est que si j'arrive bien à désactiver "Num_Lock" avec le code de PausaKawa :
    windll.user32.keybd_event(144, scan, 0, 0) # 0 Touche 144 (Numlook) appuyée
    windll.user32.keybd_event(144, scan, 1, 0) # 1 Touche Relâchée

    ... je n'arrive pas à réactiver cette même touche avec le même code.

    Mais bon, je vais chercher dans cette direction qui m'a permis de faire la moitié du chemin et qui semble prometteuse.

    Bonne soirée Flodelarab et merci encore.

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Si une réponse te plait, clique sur le pouce vert en bas à droite du message.

    J'ai un peu de mal à comprendre pourquoi tu préfères manipuler le verrouillage des nombres plutôt que récupérer "next".
    .

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    J'ai un peu de mal à comprendre pourquoi tu préfères manipuler le verrouillage des nombres plutôt que récupérer "next".
    Ca n'est pas que je préfère manipuler le verrouillage des nombres mais mon but est de détecter la touche et non sa fonction.

    Ainsi, si je détecte juste la fonction 'End' d'une touche alors je ne saurai jamais si j'ai appuyé sur la touche 'Fin' de mon clavier ou sur la touche '1' du pavé numérique (après un 'Shift').

  12. #12
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Ah oui, mais là, tu ne regardes pas au bon endroit. Si tu veux récupérer le code de la la touche (keycode), il ne faut pas chercher ce qu'il signifie (keyssym).

    Ce que tu fais actuellement existe sous linux et s'appelle xev. J'ai fait pareil que toi, et en filtrant j'obtiens cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x11, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x11, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
        state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
        state 0x0, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x0, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x1, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x1, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x0, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
        state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
        state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x11, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x11, keycode 89 (keysym 0xff9b, KP_Next), same_screen YES,
        state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
        state 0x10, keycode 89 (keysym 0xffb3, KP_3), same_screen YES,
    On verifie que la touche du pavé numérique avec un 3 a le même keycode que la touche next:
    keycode 89

    Et le next entre le pavé numérique et le reste des lettres a le keycode 117. Donc on ne peut pas confondre.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    D'accord, merci pour ces informations Flodelarab et pour le temps que vous m'avez consacré.

    Je vous souhaite une bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection touches clavier : problème avec 'Alt_L'
    Par sancho.poncho dans le forum Général Python
    Réponses: 8
    Dernier message: 03/05/2013, 22h29
  2. Problème de touche clavier
    Par patoche.05 dans le forum Langage
    Réponses: 9
    Dernier message: 27/10/2012, 16h05
  3. Problème TwebBrowser : touches claviers
    Par Invité(e) dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/07/2011, 07h47
  4. problème code touches clavier
    Par vbapprenti dans le forum Général VBA
    Réponses: 9
    Dernier message: 09/05/2011, 23h30
  5. Problème evenement touche clavier + souris
    Par nasriOM dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/11/2007, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo