Page 1 sur 1

1ère bibliothèque clavier Python pour TI-83 Premium CE

Message non luPosté: 12 Mar 2020, 17:06
de critor
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.

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
annul
de la TI-83 Premium CE, notamment pour passer l'affichage d'un message après lecture.

12302Et 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.
×
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
2nde
ou
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

**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
0
de 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
(**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 : :bj:
Code: Tout sélectionner
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 : :bj:

Lien : https://github.com/Paul-Thorel/TI-PYTHON-KEYPAD-LIBRARY

Re: 1ère bibliothèque clavier Python pour TI-83 Premium CE

Message non luPosté: 12 Mar 2020, 17:37
de CaptainLuigi
Merci Critor pour cette page !
C'est vrai que le fait d'avoir des tailles renvoyées par le clavier diffèrentes rend l'utilisation compliquée , mais je suis en train de pallier ce problème via 2 versions de getkey() , une pour les touches produisant 3/4 caractères produits , et une autre pour les autres touches ( script de conversion vers minuscules ) ...
Je vous conseille vraiment de vérifier de temps à autre le Github , car les mises à jours arriveront en priorité dessus ...
:)

Re: 1ère bibliothèque clavier Python pour TI-83 Premium CE

Message non luPosté: 13 Mar 2020, 23:02
de critor
J'ai regardé du côté de l'appli non officielle CasioPython pour Graph 35/75/85/95.
Elle inclut bien le module sys, mais malheureusement aucun stdin dedans. :(