Python : Utilisation de touches du clavier
Posté le 01/04/2020 08:44
Bonjour à tous,
Dans la continuité des actualités du site tournant pas mal en ce moment autour de l'application Python de Casio et des modules graphiques bientôt disponibles, je vous propose ici une petite astuce.
Après la publication de la première version de l'application python sur les graphs on s'est tous mis à imaginer des librairies de fonctions pour l'écran graphique, le gestion des fichiers ou encore pour le clavier. Je viens de trouver en essayant des bouts de code dans le shell de ma graph90 qu'il y avait un moyen de "controller" une touche du clavier: la touche "AC/On".
Je m'explique, le concept est assez simple: lors de l’exécution d'un programme dans le shell, a part l'instruction input(), seul la touche "AC/On" peut stopper l'exécution d'un script (ou bien une autre instruction aussi.. je ne sait plus
). L'idée est donc d'utiliser le bloc "try/ except" de python pour contrecarrer l'erreur renvoyée par la calto lors de l'arrêt forcé d'un script: "KeyboardInterrupt".
Voici donc un petit script d'exemple:
while(1):
try:
for i in range(50): pass
except KeyboardInterrupt:
print("Touche AC pressee !")
Vous remarquerez la boucle "for" dans le "try". Après avoir testé je me suis rendu compte qu'un simple "pass" ne fonctionne pas..
Ce code est plus ou moins celui que j'ai utilisé pour tester mon idée, il ne permet donc pas a proprement dit de faire faire quelque chose à la touche AC..
Je vais de mon côté continuer de chercher un code pour appliquer concrètement cette astuce. En attendant je vous laisse a votre imagination !
A+ sur PC
Citer : Posté le 01/04/2020 08:49 | #
Il me semble aussi que la calto renvoie une erreur quand la ram est surchargée.. un truc du genre "MemoryError"..
Donc techniquement on pourrait faire planter la machine en contrecarrant cette erreur de mémoire A moin que je ne n'oublie un détail ..
-Planétarium 2
Citer : Posté le 01/04/2020 09:35 | #
Par rapport à l'erreur de mémoire, tu va pas faire grand chose :
Imaginons le code suivant :
while True:
try:
a.append(0)
except MemoryError:
a.append(0)
En gros quand on a une MemorError, on essaie d'ajouter un truc en plus à l'array. Ce qui va se passer, c'est juste une exception dans une exception.
Et si tu tente de faire une récursivité dessus (dans le except appeler la méthode pour faire boucler sur l'exception), tu aura juste une RecursionError.
Citer : Posté le 01/04/2020 09:57 | #
A ok j'avais pas pensé.. mais du coup au niveau de l'astuce g pas dit de bêtises ?
-Planétarium 2
Citer : Posté le 01/04/2020 10:00 | #
Non, par contre fait gaffe à comment tu l'utilise pour pas te retrouver bloqué dans une boucle infinie.
Citer : Posté le 01/04/2020 10:02 | #
Pour le try/except c'est déjà connu, quel est l'intérêt pratique ?
L'écran n'est raffraichit que lorsque l'entrée utilisateur apparaît, ça ne permettrait même pas de faire des QTE.
À la limite un clicker ultra-simpliste, mais ce serait l'équivalent d'utiliser input() sans possibilité de quitter le programme normalement.
Citer : Posté le 01/04/2020 10:02 | #
A ok j'avais pas pensé.. mais du coup au niveau de l'astuce g pas dit de bêtises ?
Rattraper la MemoryError ne t'amènera pas loin parce tu risques de t'en prendre une autre à chaque nouvelle opération ou presque. Attention, beaucoup de choses sont dans le tas en Python. Toute la question est qu'est-ce que tu fais une fois que tu as le contrôle mais plus de mémoire.
Citer : Posté le 01/04/2020 10:07 | #
Toute la question est qu'est-ce que tu fais une fois que tu as le contrôle mais plus de mémoire.
Bonne question.. j'ai pas la réponse
Pour le try/except c'est déjà connu, quel est l'intérêt pratique ?
A vrai dire si c'est déjà connu yen à pas J'aurais tenté au moins.
Non, par contre fait gaffe à comment tu l'utilise pour pas te retrouver bloqué dans une boucle infinie.
Oui je suis au courant, j'ai déjà expérimenté trois quatre fois
Bon et bien je retiens que ça n'aura pas servit à grand chose contrairement à ce que je pensait. En tout cas merci pour vos retours, j'ai bien pris note !
PS: Je laisse le choix aux admins de supprimer le topic qui n'aura du coup servit qu'à me faire comprendre que c'est pas forcément une bonne idée. Au moins vous pourrez soulager le forum d'un sujet inutile en plus
Ajouté le 01/04/2020 à 10:12 :
En tout cas une librairie python qui permettrait de gérer le système de la calto (clavier, fichiers...) serait bien. Même si il est peu probable que l'on en voit un jour la couleur
-Planétarium 2
Citer : Posté le 01/04/2020 10:15 | #
Les topics sont rarement inutiles. Ton intervention a tout à fait sa place sur le forum, et permettra à d'autres qui se posaient les mêmes questions d'avoir des réponses ou de répondre au fil
Citer : Posté le 01/04/2020 10:16 | #
Bien vu
-Planétarium 2
Citer : Posté le 12/04/2020 23:07 | #
Je pense utiliser ton astuce couplée avec Sprito pour faire une sorte de RP maker je fais des tests et ke vous tiens au courant !
Citer : Posté le 13/04/2020 09:46 | #
Comme tu veut mais je n'ais pas testé l'astuce en conditions réelles.. autrement dit je ne dait pas si ça fonctionne comme on l'entends
-Planétarium 2
Citer : Posté le 13/04/2020 10:57 | #
J'avais fait des tests hier, j'ajouterai une fonction à Sprito (show_until_ac ?) qui implémente ça de façon limitée et relativement sécurisée.
Dans une boucle de jeu classique, c'est dangereux et instable (si l'erreur se produit durant des opérations importantes, ça coupe court).
Citer : Posté le 13/04/2020 13:13 | #
C vrai que le soucis est que la touche AC est prioritaire sur les processus en cours.. mais normalement, tant que rien ne demande au joueur de presser la touche ...
-Planétarium 2
Citer : Posté le 13/04/2020 18:28 | #
Pour info j'ai fait un POC de niaiseux basé sur le principe. Ça marche, mais c'est pas hyper stable (si y'a une seconde interruption pendant le traitement de la première)
Citer : Posté le 14/04/2020 08:58 | #
J'ai réussi à l'implémenter C'est stable chez moi… enfin, faut pas presser trop longtemps la touche sinon ça quitte… >.< Promis je fait un truc propre et je met en ligne
Citer : Posté le 14/04/2020 09:12 | #
C'est ce que j'évoquais en disant que c'était pas stable
Le cas d'une KeyboardInterrupt pendant le traitement d'une KeyboardInterrupt
À voir si avec de la récursivité y'a pas moyen de s'en protéger, mais ça serait vraiment faire du sale xD
Citer : Posté le 14/04/2020 09:14 | #
Ah oky
Faut que je teste, mais je pense que la sensibilité est liée à la boucle for du try … Du coup faut jouer entre la précision demandée à l'utilisateur pour n'avoir qu'une seule KeyboardInterrupt et la vitesse…
De manière générale le jeu reste atrocement pas intuitif mais ça marche >.<
Citer : Posté le 14/04/2020 13:05 | #
Tant que ça fonctionne
On s'en moque de l'ergonomie
-Planétarium 2
Citer : Posté le 17/04/2020 12:48 | #
Si vous avez envie d'utiliser la touche enter ( pour mettre en pause un programme , par exemple ) :
int(input())
except:
pass
Remarquez input() aurait fait pareil , my bad
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 17/04/2020 14:02 | #
Ou tout simplement
Le cast en int n'est pas nécessaire, donc on peut l'enlever. Et quitte à l'enlever, autant enlever aussi la gestion de l'exception
J'avais pas fait gaffe que tu t'étais corrigé, mais bon, autant mettre en évidence la solution propre