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 :

A la recherche d'une alternative de input [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut A la recherche d'une alternative de input
    Bonsoir,

    Je suis débutant en programmation. Je cherche à programmer une sorte de dactylo via python. J'ai cherché sur internet et n'ai rien trouvé de tel.

    Je me suis débrouillé pour le système de demande = saisie. La liste des touches demandés est complète et je ne compte pas en ajouter. Chaque demande correspond à une touche (c'est voulu).

    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
    import random
    import time
     
    n = 0
    i = 0
     
    key_ask = ["A","Z","E","R","D","F","Qclk","I0","I1","I2","Cam","Cam1","Cam2","Cam3","Cam4","Wrd"]
    key = ["a","z","e","r","d","f","c"," ","q","s","o","&","é",'"',"'","t"]
     
     
    def randomkey(key_ask):
    	return random.choice(key_ask)
     
     
    while i < 20 :
        idkey_ask = key_ask.index(randomkey(key_ask))
     
        print(key_ask[idkey_ask],": ")
     
        keypressed = input()
     
        try :
            idkey_pressed = key.index(keypressed)
        except :
            idkey_pressed = idkey_ask + 1
     
        if idkey_ask == idkey_pressed :
            n += 1
     
        i += 1
     
     
    print(n,"/20")
    Là où j'ai un problème c'est au moment de la validation du caractère saisi. La fonction input qui récupère ce qu'on a saisi, nécessite de valider avec "entrée" et c'est très embêtant car cela réduit la fluidité du programme, non pas qu'il bug mais plutôt que valider à chaque fois est contraignant.

    Ma question est donc : Peut-on éviter de valider à chaque fois avec "entrée"? En automatisant la validation par exemple ou quelque chose comme ça.

    Je ne sais pas s'il existe une fonction spécifique (je ne l'ai pas trouvé) ou si c'est possible avec input directement.

    En faisant des recherches je suis tombé sur la saisie semi-automatique (comme dans les navigateurs de recherche) qui pourrait m’intéresser dans le sens où après chaque caractère saisi il y a une sorte d'actualisation sans validation mais malheureusement c'était en java script et je n'ai rien trouvé en python qui s'en rapprochait.

    Merci pour votre patience.

    Bonne journée.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par python32123 Voir le message
    Peut-on éviter de valider à chaque fois avec "entrée"? En automatisant la validation par exemple ou quelque chose comme ça.
    Vous pouvez le faire avec une bibliothèque externe comme getch.

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

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut
    Merci wiztricks.


    Si vous passez par là et que vous êtes sur windows, j'ai rencontré quelques problèmes avec l'utilisation de la fonction getch (librairie msvcrt):
    -J’exécutais le programme sur IDLE mais il fallait de l’exécuter sur un terminal car la librairie msvcrt est spécifique à la console (apparemment).
    -Puis j'avais ce que je tapais en b'...' en utilisant la fonction msvcrt.getch(), il fallait convertir les "bytes" en "strings" ou inversement pour les comparer car la fonction renvoie ce qu'on tape en "bytes".
    -Enfin à cause de "é" (voir programme L33) là je ne sais pas trop pourquoi mais je pense que c'est au moment de la conversion de "é" en bytes ou inversement

    Tout est réglé.

    Voici le programme final (optimisable) :

    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
    42
    43
    44
    45
    46
    import random
    import time
    import msvcrt
     
    key_ask = ["A","Z","E","R","D","F","Qclk","I0","I1","I2","Cam","Cam1","Cam2","Cam3","Cam4","Wrd"]
    key = ["a","z","e","r","d","f","c"," ","q","s","o","&","é",'"',"'","t"]
     
     
    def randomkey(key_ask):
    	return random.choice(key_ask)
     
    while True :
        i = 0
        n = 0
        while i < 20 :
            idkey_ask = key_ask.index(randomkey(key_ask))
     
            print(key_ask[idkey_ask],": ")
     
            key_ref1 = key[idkey_ask]
            key_ref2 = key_ref1.encode('UTF-8')
     
            key_pressed = ''
     
            while True:
                key_pressed = msvcrt.getch()
     
                if key_pressed == key_ref2 :
                    print(key_pressed.decode('UTF-8'))
                    n += 1
                    break
     
                elif key_pressed == b'\x82' :
                    if key_ref2 == b'\xc3\xa9' :
                        print('é')
                        n += 1
                        break
                    else :
                        print('é')
                        break
     
                else :
                    print(key_pressed.decode('UTF-8'))
                    break
            i += 1
        print(n,"/20")
    Bonne soirée.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par python32123 Voir le message
    Si vous passez par là et que vous êtes sur windows, j'ai rencontré quelques problèmes avec l'utilisation de la fonction getch (librairie msvcrt):
    -J’exécutais le programme sur IDLE mais il fallait de l’exécuter sur un terminal car la librairie msvcrt est spécifique à la console (apparemment).
    -Puis j'avais ce que je tapais en b'...' en utilisant la fonction msvcrt.getch(), il fallait convertir les "bytes" en "strings" ou inversement pour les comparer car la fonction renvoie ce qu'on tape en "bytes".
    Remplace getch par readchar

    Citation Envoyé par python32123 Voir le message
    Voici le programme final (optimisable) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if key_ref2 == b'\xc3\xa9'
    	print("é")
    	n+=1
    	break
    else:
    	print("é")
    	break
    Effectivement...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if key_ref2 == b'\xc3\xa9': n+=1
    print("é")
    break
    D'ailleurs je n'arrive même pas à comprendre ta boucle while True interne car dans tous les cas tu fais un break.

    Par ailleurs écrire une fonction randomkey() qui se contente de renvoyer un random.choice() on se demande la plus-value de la fonction...
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import random
    import time
    import readchar
     
    valeurs={
    	"A" : "a",
    	"Z" : "z",
    	"E" : "e",
    	"I2" : "é",
    	# ... (tout le reste à l'avenant)...
    }
     
    while True :
    	n = 0
    	for i in range(20):
    		ask=random.choice(tuple(valeurs.keys()))
     		print(ask,": ")
     		rep = readchar.readchar()
     
    		# ctrl-c
    		if ord(rep) == 3: raise KeyboardInterrupt(ord(rep))
     
    		if rep == valeurs[ask]:
    			print(rep)
    			n += 1
    		# if
    	# for
    	print("Résultat: %d/20" % n)
    # while
    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]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par python32123 Voir le message
    -J’exécutais le programme sur IDLE mais il fallait de l’exécuter sur un terminal car la librairie msvcrt est spécifique à la console (apparemment).
    -Puis j'avais ce que je tapais en b'...' en utilisant la fonction msvcrt.getch(), il fallait convertir les "bytes" en "strings" ou inversement pour les comparer car la fonction renvoie ce qu'on tape en "bytes".
    Tout cela est documenté.

    -Enfin à cause de "é" (voir programme L33) là je ne sais pas trop pourquoi mais je pense que c'est au moment de la conversion de "é" en bytes ou inversement
    Ce qui est sûr, c'est que l'appui sur une touche du clavier retournera un ou plusieurs bytes et la correspondance avec des caractères devra parfois être faite "a la main" (si on sort de l'ASCII) car getch est de très bas niveau (et les encoding sont ignorés par les claviers).

    Est ce qu'il y a mieux? J'en sais rien, je n'ai pas (jamais?) cherché: je réserve la console pour des codes basiques... Et je passe en mode graphique pour le reste.

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

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut
    Bonsoir,

    Tout d'abord pour répondre à Sve@r :
    -La boucle while True avait pour but d'avoir le temps de saisir un caractère (appuyer sur un touche) car je pensais que la fonction getch n'attendais pas que l'on appui sur une touche pour renvoyer une valeur et donc sans cette boucle je me retrouvais avec mon programme qui défilait à toute allure sans que je n'ai eu le temps d'appuyer de saisir une bonne touche. Mais je m'étais trompé car c'est qu'il m'arrivait sur IDLE mais je n'avais pas retesté via la console...
    -J'avais créé la fonction randomkey en pensant l'utiliser plus d'une fois, je l'ai laissée par oubli.

    Merci pour toutes ces nouvelles fonctions et mécaniques, et pour l'optimisation!


    Pour répondre à wiztricks :

    Merci pour ces informations et encore pour ton aide !


    Je vais tenter de faire une interface à présent.

    Bonne soirée.

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    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 : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Tu ne veux pas utiliser d'interface graphique?
    Exemple d'utilisation des évenements clavier avec tkinter:
    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
    import tkinter as tk
     
     
    idkey = {'a': 'A', 'z': 'Z', 'e': 'E', 'r': 'R', 'd': 'D', 'f': 'F',
             'c': 'Qclk', ' ': 'I0', 'q': 'I1', 's': 'I2', 'o': 'Cam', '&': 'Cam1',
             'é': 'Cam2', '"': 'Cam3', "'": 'Cam4', 't': 'Wrd'}
     
    def aff(event):
            if event.char:
                    label['text'] = f"Touche pressée: {event.char},\
     Équivalence: {idkey.get(event.char, 'Non définie')}"
     
    root = tk.Tk()
    label = tk.Label(root, text="presse une touche", font=("Helvetica", 40))
    label.grid()
    root.bind("<Key>", aff)
    root.mainloop()

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par python32123 Voir le message
    Je vais tenter de faire une interface à présent.
    Hum, tu aurais commencé par ça... Les IHM possèdent généralement des outils pour détecter en instantané la modification de leur zone texte.
    Un exemple en PyQt
    Nom : ex09_emettreSignal.png
Affichages : 327
Taille : 8,7 Ko

    Et le code correspondant : https://pyqt.developpez.com/telechar...s-notre-signal
    PyQt est un peu plus élaboré que tkinter montré par Hominidé. Mais l'inconvénient est qu'il n'est pas en standard (il faut le télécharger et l'installer et l'apprendre). Mais si tu veux coder de jolis et puissants trucs ça vaut le coup...

    Accessoirement ton code ne correspond pas à un code de dactylo. Un test dactylo consiste à recopier un texte montré à l'écran et à mesurer le temps passé, pas à proposer une valeur et attendre qu'on donne sa correspondance exacte. Ca c'est plutôt un test de réflexes...
    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]

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

Discussions similaires

  1. [Formulaire] recherche d'une liste des types d'input
    Par teen6517 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/03/2007, 13h08
  2. [Wamp] Recherche une alternative à EasyPHP
    Par rakion dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 10/02/2007, 12h52
  3. recherche une alternative à MailNavigator?
    Par Ksual dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 06/02/2006, 18h46
  4. Débutant - Recherche une alternative à TStringGrid
    Par TopDelire dans le forum Débuter
    Réponses: 2
    Dernier message: 27/12/2005, 14h47

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