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 :

Fonctionnement de Python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut Fonctionnement de Python
    Dans les milliers de lignes qui décrivent le fonctionnement de Python, j'ai dû en rater deux ou trois : dont celles qui expliquent mon problème.
    Voici un script très élémentaire.
    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
    # ! /usr/bin/env python3
    # -*- coding: utf-8 -*-
    import os
    import tkinter as tk
    import os
    fen1 = tk.Tk()
    fen1.title('TEST')
    fen1.geometry('300x400')
    fen1.configure(bg='black')
    os.system('xset r off')  # on desactive la repetition des touches
    
    def ma_fonction(event):
        # imprime la touche frappée....
        laTouche = event.keysym
        print(laTouche)
        
        # la solution barbare que j'ai trouvée...
        # if laTouche == "KP_End":
        #     laTouche = "KP_1"
        # print(laTouche)
    
    os.system('xset r off')  # désactive la variable systeme repetition des touches
    
    # les deux options : valider KeyPress ou KeyRelease ...
    fen1.bind('<KeyPress>', ma_fonction)
    fen1.bind('<KeyRelease>', ma_fonction)
    
    fen1.mainloop()
    os.system('xset r on')  # reactive la répétition des touches
    Vous remarquerez les deux lignes 25 et 26 (une seule devrait suffire) qui devraient m'envoyer le même résultat et cela est vrai pour toutes les touches du clavier sauf pour celles du pavé numérique.
    Si je n'utilise que la ligne 25. Tout marche bien
    Si je n'utilise que la ligne 26, la touche "KP_1" frappée est reconnue comme étant la touche alternative "KP_End".
    Et si je valide les deux lignes, cela me retourne clé frappée "KP_1" clé relachée "KP_End"
    Tout ceci montre que Python ne se comporte pas comme un langage interprété 'classique' c'est à dire "instruction par instruction : mais qu'il manipule ( pardon : "pré-compile" un script " à sa sauce" et c'est la recette de cette sauce, que j'aimerais connaître.
    Si quelqu'un peut m'expliquer ce que je crois être un phénomène, mais qui n'est dû qu'à mon ignorance, j'en serais ravi. Merci à tous.
    PS. J'ai la doc Python à peu près intégrale mais trouver trois lignes parmi des milliers, ce n'est pas évident. Je précise que je suis sous Ubuntu (22.04), avec PyCharm et que j'utilise Python 3.10

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    Python n'est pour rien ici: c'est TCL/Tk qui récupère les "bind" et qui appelle la fonction lorsque l'évènement arrive. Et comme vous êtes sous Ubuntu, on peut supposer que le gestionnaire d'écran est X11 et normalement, c'est lui qui s'occupe de ces "détails".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 629
    Points : 30 859
    Points
    30 859
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par azad2b Voir le message
    Dans les milliers de lignes qui décrivent le fonctionnement de Python, j'ai dû en rater deux ou trois : dont celles qui expliquent mon problème.
    Ouaip, j'avoue là c'est franchement pas de bol..

    Citation Envoyé par azad2b Voir le message
    Vous remarquerez les deux lignes 25 et 26 (une seule devrait suffire) qui devraient m'envoyer le même résultat et cela est vrai pour toutes les touches du clavier sauf pour celles du pavé numérique.
    Si je n'utilise que la ligne 25. Tout marche bien
    Si je n'utilise que la ligne 26, la touche "KP_1" frappée est reconnue comme étant la touche alternative "KP_End".
    Et si je valide les deux lignes, cela me retourne clé frappée "KP_1" clé relachée "KP_End"
    Il est vrai que les touches du pavé numérique ont deux significations, tantôt un chiffre, tantôt un déplacement. C'est probablement la méthode utilisée par Tk permettant de choisir ce que l'on veut récupérer. Celui qui veut les flèches devra prendre <KeyRelease>.

    Citation Envoyé par azad2b Voir le message
    Tout ceci montre que Python ne se comporte pas comme un langage interprété 'classique' c'est à dire "instruction par instruction : mais qu'il manipule ( pardon : "pré-compile" un script " à sa sauce"
    Qu'est-ce qui justifie cette conclusion? Quand je teste ton programme, je tente des trucs comme laisser appuyer avant de relacher, et je vois bien le KeyPress s'afficher avant que je ne relache ma pression.
    Par ailleurs tu entres là dans le domaine de la gestion évènementielle, qui effectivement n'est pas linéaire car ça réagit aux évènements non pas dans l'ordre dans lequel la réaction a été programmée mais dans l'ordre dans lequel les évènements arrivent. Mais ce n'est pas Python qui fait cette sauce mais la librairie IHM (ici Tk). En l'état, ton code ne permet pas d'incriminer Python. Et à mon sens, Python pur travaille bien instruction par instruction.
    Ceci dit, effectivement Python c'est aussi du compilé (plus exactement du "byte-codé"). Chaque fois que tu inclues un de tes scripts "xxx.py" en tant que module, Python génère un dossier "__pycache__" dans lequel il place ton code transformé en byte-code (fichier ".pyc"). Puis si tu relances ton script mais que "xxx.py" n'a pas été modifié, alors c'est bonus.
    Tu peux toi-aussi générer manuellement un pyc à partir d'un py via le module "compileall".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Par curiosité ça donne quoi avec pynput ou autre module capable de capter les touches ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Salut !

    Par curiosité ça donne quoi avec pynput ou autre module capable de capter les touches ?
    Merci de ta réponse.
    J'avais essayé pynput il y a quelque temps, pour résoudre un problème que je ne comprenais pas dans une fonction très longue. et qui elle aussi captait plusieurs fois des évènements "clavier". Ca avait marché mais après réflexion, j' ai scindé cette fonction en 3 autres plus digestes et tout était rentré dans l'ordre. C'est à partir de là que j'en avais conclu, un peu vite peut-être que Python tenait compte de la suite des évènements quand il traitait une fonction.
    Cela étant, le plus simple pour moi est de ne plus faire appel aux cinq touches du pavé numérique que mon projet utilise et d'utiliser 5 touches arbitraires du clavier principal. Car après tout, c'est le KeyCode d'une touche que j' utilise. D'ailleurs, une fois terminé, mon projet utilisera un clavier virtuel (fabriqué avec un module Arduino, ou Raspberry) et utilisant des boutons poussoirs genre "Industriel". Ce qui rendra le script indépendant et du système et des librairies externes et du hard. Parce qu'en plus, je n'avais pas osé vous en parler, mais mon ordinateur est un Mac-Pro de bureau de chez Apple. Et quand on connaît ces zèbres là, on s'attend à tout.
    Mais tout de même, histoire de ne pas mourir complètement idiot, je crois que je vais aller voir du coté des variables système de Linux, un peu comme je l'ai fait avec la fonction répétition des touches dont je me sert ici, et aussi étudier un peu TCL/Tk comme l'indique Wistricks (que je salue).

  6. #6
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 862
    Points : 1 508
    Points
    1 508
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    ... En tout cas, le codeur n'est nullement limité par la façon de faire de tkinter lorsqu'il veut utiliser les évènements claviers (y compris ceux du clavier numérique).
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

Discussions similaires

  1. Python cesse de fonctionner
    Par coco1825 dans le forum Général Python
    Réponses: 12
    Dernier message: 05/06/2014, 17h52
  2. Quel moteur 3D choisir (et fonctionnant) sur Python 3.3?
    Par gblassel dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 12/10/2013, 18h41
  3. Réponses: 1
    Dernier message: 18/02/2012, 16h20
  4. "python print" ne fonctionne pas
    Par oodini dans le forum Général Python
    Réponses: 12
    Dernier message: 19/01/2012, 22h49

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