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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    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 expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    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 : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    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()
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    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 : 198
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]

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Tu ne veux pas utiliser d'interface graphique?
    Citation Envoyé par Sve@r Voir le message
    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.
    Je ne pensais pas que le code changerait à ce point. Je comptais y aller petit à petit en améliorant le code de base pour arriver à un objectif final tout autre.

    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...
    Pas de problème, je suis là pour apprendre, je vais regarder ça.

    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...
    En effet, j'ai pensé au test de dactylo car le but était d'appuyer sur la touche correspondante à celle qui était affichée.

    Hors sujet par rapport au topic : "L'objectif final" ce serait une sorte jeu de visée (aimbooster) mais au lieu de tirer avec un clic, il faudrait appuyer sur la bonne touche pour faire disparaître la cible.

    J'en déduis qu'il faut que je m'attaque directement à l'objectif final car autrement je vais mettre un temps considérable pour y arriver. Même si en soit ça ne me dérange pas plus que ça car j'apprends des notions au passage qui peuvent me servir dans d'autres projets.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    bonjour

    Si c'est pour du jeu, pygame est fait pour cela et gère à sa façon les évenements clavier

    Citation Envoyé par python32123 Voir le message
    J'en déduis qu'il faut que je m'attaque directement à l'objectif final
    pas forcément, au contraire. On apprend plus avec de mini projets. Se lancer dans un "gros" projet dès le début est insurmontable pour un pur débutant.

    Il faut surtout bien choisir ton environnement. gui: graphique type Qt/Gtk ou tkinter ; console ; ou pygame sont des choses completement différentes. L'architecture du code n'a rien à voir entre les 3 et les librairies à utiliser sont bien différentes.
    On apprend python en mode console puis, une fois digéré python, on passe à des frameworks spécialisés (donc plus qu'a apprendre le framework spécifique)
    $moi= ( !== ) ? : ;

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par python32123 Voir le message
    Je ne pensais pas que le code changerait à ce point. Je comptais y aller petit à petit en améliorant le code de base pour arriver à un objectif final tout autre...J'en déduis qu'il faut que je m'attaque directement à l'objectif final car autrement je vais mettre un temps considérable pour y arriver.
    Oui et non.
    Le souci spécifique de ton idée c'est que tu t'es attaqué au clavier. Or le clavier c'est un truc super bas niveau dans la machine. Et donc le changement de technologies entraine un changement radical dans la façon de le prendre en compte.

    Tu aurais pensé "je veux programmer un code qui joue aux échecs" là tu aurais pu coder l'IA en premier, car dans ce cas les accès IO se font en dernier et le code de l'IA ne dépend pas de l'outil d'affichage.

    En programmation professionnelle on essaye de bien séparer le Modèle (tout ce qui est stockage permanent de l'information), la Vue (tout ce qui est saisie/affichage) et le Contrôleur (traitement et calcul des données) => programmation MVC.
    Ceci dit c'est pas forcément évident. Par exemple il m'est arrivé de coder dans Postgres (c'est une bdd donc ça fait partie du Modèle) des calculs de données qui se font automatiquement à l'insertion (parce que plus rapide et que postgres possède des triggers qui permet de lancer automatiquement des procédures lors des insert/update/delete) alors que le calcul devrait se faire dans le Contrôleur Python mais qui est plus lent.

    Pour un jeu, même si PyQt permet d'en créer, Pygame est un outil plus dédié...
    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]

  12. #12
    Invité
    Invité(e)
    Par défaut
    Au sujet de pygame et de la gestion des évènements clavier, j'ai souvent rencontré des problèmes (touche relevée considérée comme encore enfoncée...), voici ma solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    keys_pressed = {}
    while 1:  
        for event in pygame.event.get():       
            if event.type == pygame.locals.KEYDOWN :
                keys_pressed[event.key] = True
     
            elif event.type == pygame.locals.KEYUP :           
                keys_pressed[event.key] = False
     
        for key in keys_pressed:
            if keys_pressed[key]:
                if key == pygame.locals.K_LCTRL :
                    do_something()
    Exemple codé à la va-vite :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    import pygame, pygame.locals, random, time
    import numpy as np
     
    KEY_UP = (pygame.locals.K_UP,pygame.locals. K_z)
    KEY_DOWN = (pygame.locals.K_DOWN, pygame.locals.K_s)
    KEY_RIGHT = (pygame.locals.K_RIGHT, pygame.locals.K_d)
    KEY_LEFT = (pygame.locals.K_LEFT, pygame.locals.K_q)
     
    GREY = (72,70,74)
    COLOR = (230, 200, 100)
    COORDS = (96, 54)
     
    POINT = 0
     
    pygame.init()
    pygame.font.init()
    font = pygame.font.SysFont('Agency', 30)
     
    pygame.mixer.init()
    pygame.mixer.music.load('1983.mp3')
    pygame.mixer.music.play(-1)
     
    SCREEN = pygame.display.set_mode((500, 500), pygame.NOFRAME)
     
    def random_rect(start=False):
        global BACKGROUND, size, x, y, COLOR
     
        BACKGROUND = pygame.Surface((500,500))
        BACKGROUND.fill(GREY)
        size = random.randint(10,100)
        x, y = random.choices(range(0,500-size), k=2)
     
        if not start:
            red = random.randint(0,255)
            green = random.randint(0,255)
            blue = random.randint(0,255)
            COLOR = red, green , blue    
     
        pygame.draw.rect(BACKGROUND, COLOR, pygame.Rect(x, y, size, size), width=2)
        SCREEN.blit(BACKGROUND, (0,0))
        pygame.draw.circle(SCREEN, COLOR, COORDS, 5)
        text = font.render('Total : ' +str(int(POINT)) + ' pt(s)', True, (255,255,255))
        text2 = font.render('Slow motion : Left Ctrl | New rect : Spacebar ', True, (255,255,255))
        SCREEN.blit(text, (0,0))
        SCREEN.blit(text2, (0,480))
        pygame.display.update()
     
     
     
    def move(coords):
        global COORDS, POINT, t0
     
        NEW_COORDS = COORDS[0]+coords[0], COORDS[1]+coords[1]
        if NEW_COORDS[0] > 5 and NEW_COORDS[0] < 495 and NEW_COORDS[1] > 5 and NEW_COORDS[1] < 495:
            COORDS = NEW_COORDS
            SCREEN.blit(BACKGROUND, (0,0))
            pygame.draw.circle(SCREEN, COLOR, COORDS, 5)        
            pygame.display.update(COORDS[0]-10, COORDS[1]-10, 20, 20)
            text = font.render('Total : ' +str(int(POINT)) + ' pt(s)', True, (255,255,255))
            text2 = font.render('Slow motion : Left Ctrl | New rect : Spacebar ', True, (255,255,255))
            SCREEN.blit(text, (0,0))
            SCREEN.blit(text2, (0,480))
            pygame.display.update(0,0,250,30)
            pygame.display.update(0,480,500,30)
     
        if COORDS[0] > x and COORDS[0] < x+size and COORDS[1] > y and COORDS[1] < y+size:
            a = np.array(GREY)
            b = np.array(COLOR)
            dist = np.linalg.norm(a-b)
     
            POINT += max(0, 100000/(size*30+dist*20+(time.time()-t0)*5))
            t0 = time.time()
            random_rect()
     
     
     
    random_rect(True)
    keys_pressed = {}
    pygame.key.set_repeat(100,5)
    t0 = time.time()
    SPEED = 1000
    while 1:  
        pygame.time.Clock().tick(SPEED)
     
        for event in pygame.event.get():       
            if event.type == pygame.locals.KEYDOWN :
                keys_pressed[event.key] = True
                if event.key == pygame.locals.K_ESCAPE:
                    pygame.quit()
                    break
     
            elif event.type == pygame.locals.KEYUP :           
                keys_pressed[event.key] = False
                if event.key == pygame.locals.K_SPACE:
                    POINT -= 100
                    random_rect()
                if event.key == pygame.locals.K_LCTRL:
                    SPEED = 1000
     
        for key in keys_pressed:
            if keys_pressed[key]:
                if key == pygame.locals.K_LCTRL :
                    SPEED = max(50,SPEED-1)
                    POINT = POINT-(10/SPEED)
     
                if key in KEY_UP:
                    move((0,-1))
     
                if key in KEY_DOWN:
                    move((0,1))
     
                if key in KEY_RIGHT:
                    move((1,0))
     
                if key in KEY_LEFT:
                    move((-1,0))
    Musique : 1983.mp3

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    Citation Envoyé par papajoker Voir le message
    pas forcément, au contraire. On apprend plus avec de mini projets. Se lancer dans un "gros" projet dès le début est insurmontable pour un pur débutant.
    Tout à fait d'accord !

    Citation Envoyé par papajoker Voir le message
    L'architecture du code n'a rien à voir entre les 3 et les librairies à utiliser sont bien différentes.
    Un peu moins sur ce coup, en tout cas c'est discutable, car à mon sens l'architecture devrait être la même, c'est la syntaxe qui différera selon la GUI choisie.
    La relation des objets métier ne doit pas différer selon le choix que tu feras d'utiliser PyQt ou Tkinter par exemple...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Merci pour votre aide à tous!

    Finalement ce qu'on a fait au début m'a bien servi et les autres informations me seront utiles à l'avenir.

    J'ai bien avancé et ça fonctionne (il me reste quelques ajouts au niveau du taux d'apparition par ex).

    Si ça vous intéresse.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    import pygame
    import random
    import math
     
    # Initialisation de pygame
    pygame.init()
     
    # Création de la fenêtre
    screen = pygame.display.set_mode((1500, 900))
     
    # Fond d'écran
    background = pygame.image.load('background.jpg')
     
    # Titre et Icône
    pygame.display.set_caption('APM Trainer')
    icon = pygame.image.load('cible_icon.png')
    pygame.display.set_icon(icon)
     
    # Images : j'ai renommé les images associées aux touches de la même manière que la touche associée
    List_images = ["a", "z", "e", "r", "d", "f", "c", "space", "q", "s", "o", "1", "2", "3", "4", "t"]
     
    # Touches & Cibles
    keyImg = []
    keyX = []
    keyY = []
    image = []
    cibleImg = []
    cibleX = []
    cibleY = []
    nb_cibles = 5
     
    # Initialisation des cibles/images correspondantes
    for i in range(nb_cibles):
        image.append(random.choice(List_images))
        X = random.randint(0, 1436)
        Y = random.randint(0, 836)
        cibleImg.append(pygame.image.load('cible.png'))
        keyImg.append(pygame.image.load(image[i] + '.png'))
        cibleX.append(X)
        cibleY.append(Y)
        keyX.append(X + 16)
        keyY.append(Y + 16)
     
     
    def cible(x, y, z):
        screen.blit(cibleImg[z], (x, y))
        screen.blit(keyImg[z], (x + 16, y + 16))
     
     
    # Fonction définition de la hitbox + a-t-on touché?
    def is_hit(a, b, c, d):
        distance = math.sqrt((math.pow(a - c - 32, 2)) + (math.pow(b - d - 32, 2)))
        if distance <= 32:
            return True
     
     
    # Score
    score = 0
    total = 0
    score_total = 0
     
    police = pygame.font.Font('freesansbold.ttf', 32)
    textX = 10
    textY = 10
     
     
    def aff_score(x, y):
        s = police.render('Accuracy : ' + str(score_total) + "%", True, (0, 0, 0))
        screen.blit(s, (x, y))
     
     
    # Jeu
    running = True
    while running:
     
        # Couleur Fond
        screen.fill((0, 0, 0))
     
        # Image Fond
        screen.blit(background, (0, 0))
     
        # Interaction
        for event in pygame.event.get():
            # Quitter
            if event.type == pygame.QUIT or event.type == pygame:
                running = False
     
            # Si touche pressée
            if event.type == pygame.KEYDOWN:
                cursorpos = pygame.mouse.get_pos()
                key_pressed = pygame.key.name(event.key)
                # Pour chaques cibles
                for i in range(nb_cibles):
                    hit = is_hit(cursorpos[0], cursorpos[1], cibleX[i], cibleY[i])
                    # Si le curseur est dans la hitbox
                    if hit:
                        # Si la touche correspond à la touche demandée
                        if key_pressed == image[i]:
                            score += 1
     
                        image[i] = random.choice(List_images)
                        cibleX[i] = random.randint(0, 1436)
                        cibleY[i] = random.randint(0, 836)
                        keyImg[i] = pygame.image.load(image[i] + '.png')
     
                total += 1
                score_total = round(score / total * 100, 1)
     
        # Update
        for i in range(nb_cibles):
            cible(cibleX[i], cibleY[i], i)
     
        aff_score(textX, textY)
        pygame.display.update()
    Bonne soirée.

    (Voir message suivant pour les fichiers manquants)
    (Il manque l'image de fond mais si je la joint ça risque de polluer le fil des messages, créer une image (claire) format jpg sur paint par ex de dimension 1500x900, la renommer : background)
    Images attachées Images attachées       

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par python32123 Voir le message
    Si ça vous intéresse.
    Il faudrait aussi les "à côtés" (les jpg, les ttf, etc...)

    Citation Envoyé par python32123 Voir le message
    image[i] + '.png'
    "%s.png" % image[i].
    "{}.png".format(image[i]).

    Citation Envoyé par python32123 Voir le message
    'Accuracy : ' + str(score_total) + "%"
    'Accuracy : %.02f%%' % score_total.
    'Accuracy : {:.02f}%'.format(score_total).

    Citation Envoyé par python32123 Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def is_hit(a, b, c, d):
    	distance = math.sqrt((math.pow(a - c - 32, 2)) + (math.pow(b - d - 32, 2)))
    	if distance <= 32:
    		return True
    En plus de nuire à la lisibilité, les parenthèses inutiles sont plus qu'inutiles. Elles montrent que tu ne sais pas les utiliser et gaspillent du CPU pour rien. Et si distance > 32 la fonction retourne quoi ???
    def is_hit(a, b, c, d): return math.sqrt(math.pow(a - c - 32, 2) + math.pow(b - d - 32, 2)) <= 32.
    Et si, au lieu de gérer les coordonnées des points de façon séparées tu les groupais justement dans un vrai point ça simplifierait pas mal de trucs (déjà tu passerais deux points à la fonction au lieu de passer les 4 valeurs séparément)
    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]

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En plus de nuire à la lisibilité, les parenthèses inutiles sont plus qu'inutiles. Elles montrent que tu ne sais pas les utiliser et gaspillent du CPU pour rien. Et si distance > 32 la fonction retourne quoi ???
    D'accord, je ne pensais pas que ça avait un impact aussi significatif, c'était pour rendre plus lisible mais c'était en effet une mauvaise idée. Si distance > 32 elle renvoie "None".

    Citation Envoyé par Sve@r Voir le message
    Et si, au lieu de gérer les coordonnées des points de façon séparées tu les groupais justement dans un vrai point ça simplifierait pas mal de trucs (déjà tu passerais deux points à la fonction au lieu de passer les 4 valeurs séparément)
    Je m'y penche. (Édit : fait)

    Citation Envoyé par Sve@r Voir le message
    Il faudrait aussi les "à côtés" (les jpg, les ttf, etc...)
    Voir pièces jointes et message précédent.

    Merci pour les corrections/optimisations.
    (Voir message précédent pour les fichiers manquants)
    Images attachées Images attachées             

+ 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