Les fonctions graphiques en Python c'est sympa, notamment pour la conception d'interfaces et jeux.
Nous en avons depuis le début chez NumWorks.
Casio pour sa part s'apprête à les rajouter sur Graph 35+E II et Graph 90+E avec sa mise à jour d'Avril 2020.
Texas Instruments quant à lui les rajoutera sur TI-83 Premium CE Edition Python avec sa mise à jour 5.5de Mai 2020, puis sur TI-Nspire CX II avec la mise à jour de rentrée 2020.
Mais encore faut-il pouvoir interagir avec les interfaces et jeux en question.
Pour cela, des fonctions permettant de détecter les pressions de touches clavier sont nécessaires.
Nous en avons depuis le début chez NumWorks.
Casio pour sa part s'apprête à les rajouter sur Graph 35+E II et Graph 90+E avec sa mise à jour d'Avril 2020.
Texas Instruments quant à lui les rajoutera sur TI-83 Premium CE Edition Python avec sa mise à jour 5.5de Mai 2020, puis sur TI-Nspire CX II avec la mise à jour de rentrée 2020.
Mais encore faut-il pouvoir interagir avec les interfaces et jeux en question.
Pour cela, des fonctions permettant de détecter les pressions de touches clavier sont nécessaires.
NumWorks est sur le point d'en rajouter pour sa prochaine version 13.
Mais rien de tel de au menu des prochaines mises à jour Texas Instruments et Casio à notre connaissance.
Chez Texas Instruments on peut bien noter quelque chose en ce sens avec la fonction escape() du futur module ti_system, mais à notre connaissance c'est pour gérer le seul cas particulier de la pression de la touche
Mais rien de tel de au menu des prochaines mises à jour Texas Instruments et Casio à notre connaissance.
Chez Texas Instruments on peut bien noter quelque chose en ce sens avec la fonction escape() du futur module ti_system, mais à notre connaissance c'est pour gérer le seul cas particulier de la pression de la touche
annulde la TI-83 Premium CE, notamment pour passer l'affichage d'un message après lecture.
Et si on se fabriquait nous-mêmes de telles fonctions ? Paul Thorel alias CaptainLuigi a eu l'idée de regarder du côté du module sys de la TI-83 Premium CE, et plus particulièrement du flux d'entrée stdin avec ses méthodes read(), readline() et readlines().
Il y a moyen de détecter la pression d'une touche en lisant le flux d'entrée.
A noter que cette astuce n'est pas utilisable sur les Casio Graph 90/35+E II, car le module sys n'y est pas disponible. Si il est certes présent dans la version alpha avec la future application Python pour HP Prime, nous n'avons pas réussi à en faire fonctionner la fonction readline() correctement.
Voici le détail des écritures stdin associées aux touches de la TI-83 Premium CE, ainsi que leurs variantes en cas de combinaison de la pression avec les touches modificatrices
A priori, cela va être difficile de créer une unique fonction détectant de façon fiable les pressions de l'ensemble des touches clavier.
En effet les écritures stdin associées sont de tailles différentes. Or les fonctions de lecture readline() et compagnie sont bloquantes, et nous ne disposons pas sur TI-83 Premium CE du module permettant de les reconfigurer en non-bloquantes.
C'est-à-dire que si l'on demande 3 caractères pour détecter les appuis sur les flèches et touches de validation/annulation, les pressions sur la plupart des autres touches n'écrivant qu'1 à 2 caractères dans le stdin ne rendront pas la main à notre script.
Nous ne disposons pas non plus de la fonction stdin.isatty() permettant de savoir si il y a encore des données à lire dans le flux d'entrée.
Donc dans le cadre d'une lecture caractère par caractère, impossible de différencier l'espace produit par
Il y a moyen de détecter la pression d'une touche en lisant le flux d'entrée.
×par exemple y écrit
*
, ÷
/
, ^
**
, annul
[2K
, →
[C
et entrée
[F
.A noter que cette astuce n'est pas utilisable sur les Casio Graph 90/35+E II, car le module sys n'y est pas disponible. Si il est certes présent dans la version alpha avec la future application Python pour HP Prime, nous n'avons pas réussi à en faire fonctionner la fonction readline() correctement.
Voici le détail des écritures stdin associées aux touches de la TI-83 Premium CE, ainsi que leurs variantes en cas de combinaison de la pression avec les touches modificatrices
2ndeou
alpha:
f(x) | fenêtre | zoom | trace | graphe |
2nde | mode | suppr | ← [D [H | ↑ [A |
alpha | X,T,θ,n X x | stats | ↓ [B | → [C [F |
math a A | matrice b B | prgm c C | var | annul [2K |
◄► d D | trig pi e E | résol f F | □/□ g G | ^ ** h H |
x² **2 sqrt() [1D i I | , , E j J | ( ( { k K | ) ) } l L | / / e m M |
log log(,10) [4D 10**() [1D n N | 7 7 o O | 8 8 p P | 9 9 q Q | × * [ r R |
ln log() [1D exp() [1D s S | 4 4 t T | 5 5 u U | 6 6 v V | - - ] w W |
sto→ = \\ x X | 1 1 y Y | 2 2 z Z | 3 3 @ | + + ' " |
on | 0 0
| . . : | (-) - _ ? | entrée [F |
A priori, cela va être difficile de créer une unique fonction détectant de façon fiable les pressions de l'ensemble des touches clavier.
En effet les écritures stdin associées sont de tailles différentes. Or les fonctions de lecture readline() et compagnie sont bloquantes, et nous ne disposons pas sur TI-83 Premium CE du module permettant de les reconfigurer en non-bloquantes.
C'est-à-dire que si l'on demande 3 caractères pour détecter les appuis sur les flèches et touches de validation/annulation, les pressions sur la plupart des autres touches n'écrivant qu'1 à 2 caractères dans le stdin ne rendront pas la main à notre script.
Nous ne disposons pas non plus de la fonction stdin.isatty() permettant de savoir si il y a encore des données à lire dans le flux d'entrée.
Donc dans le cadre d'une lecture caractère par caractère, impossible de différencier l'espace produit par
alpha
0de celui commençant les écritures associées aux flèches et touches de validation/annulation, ou encore le
*
associé à la touche ×de celui démarrant également les écritures associées aux touches
^(
**
) et x²(
**2
). Bref, en attendant mieux il faut faire des choix. Dans le cadre d'interfaces et jeux il y a sans doute possibilité de s'en sortir avec les seules flèches et touches de validation/annulation, soit de demander 3 caractères sur le flux d'entrée à chaque fois. CaptainLuigi te sort un petit script en ce sens, n'hésite pas à l'exploiter pour tes futures créations :
Et petite démo, ça a l'air rapide ce qui est a priori un très bon signe pour tes futurs jeux et interfaces en Python :
- Code: Select all
from sys import *
def getkey(n=3):
return list(stdin.readline(n))
def ispressed(key="up",keylist=[]):
if key=="enter":
key=" [F"
if key=="up":
key=" [A"
if key=="down":
key=" [B"
if key=="right":
key=" [C"
if key=="left":
key=" [D"
if key=="annul":
key=" [2"
press=True
for i in range(3):
if key[i]==keylist[i]:
press=True
else:
press=False
return press
Et petite démo, ça a l'air rapide ce qui est a priori un très bon signe pour tes futurs jeux et interfaces en Python :
Lien : https://github.com/Paul-Thorel/TI-PYTHON-KEYPAD-LIBRARY