Page 1 of 1

print en couleur via codes CSI sur TI-83 Premium CE Python

Unread postPosted: 05 Jun 2021, 12:16
by critor
Le langage Python de la TI-83 Premium CE Edition Python et les modèles équivalents (TI-84 Plus CE-T Python Edition en Europe, TI-84 Plus CE Python en Amérique du Nord) te permettait d'afficher du texte en couleur grâce à ti_graphics, sa bibliothèque de tracé par pixels.

Code: Select all
from ti_graphics import drawString, setColor
from ti_system import disp_wait

setColor((255, 0, 255))
drawString("Hallo TI", 0, 30)
disp_wait()


Contrairement à celles de bibliothèques concurrentes, les primitives de ti_graphics ne gèrent pas de couleur de fond.

On peut toutefois construire de quoi contourner la chose, en traçant un rectangle plein sur lequel on écrit ensuite le texte :
Code: Select all
from ti_graphics import drawString, fillRect, setColor
from ti_system import disp_wait

def myDrawString(s, x, y, cf, cb=None):
  if cb:
    setColor(cb)
    fillRect(x, y, 10 * len(s), 15)
  setColor(cf)
  drawString(s, x, y)   

myDrawString("Hallo TI", 0, 30, (255, 255, 0), (0, 0, 255))
disp_wait()

L'affichage de texte couleur via ti_graphics a toutefois divers inconvénients selon ce que tu fais :
  • l'affichage est ici superposé à celui de la console, mais avec un système de positionnement totalement différent, ce qui impliquera quelques acrobaties si tu souhaites le faire coexister avec des print()
  • l'affichage superposé à la console sera perdu à chaque rafraîchissement de celle-ci, d'où la nécessité de mettre le script en pause juste après ces affichages via un appel disp_wait()
  • dans tous les cas obtenir 1 affichage de texte couleur nécessite bien plus de lignes qu'un simple print() et donc autant de choses à comprendre, ce qui peut rebuter les débutants


Et bien formidable découverte de commandblockguy, les TI-83 Premium CE Edition Python et compatibles gèrent des commandes CSI directement dans la console Python ! :D

Les commandes CSI pour Control Sequence Introducer (plus d'infos ici), partie de ce qu'on appelle en français séquences d'échappement ANSI, sont des codes directement intégrés aux chaînes de caractère et permettant de contrôler le formatage du texte leur faisant suite dans une console ou un terminal.

C'est fantastique, les 2 affichages couleur précédents peuvent maintenant être réalisés dans la console en seulement 2 lignes, rien à importer ! :bj:
Code: Select all
print("\x1B[5mHallo TI")
print("\x1B[3;4mHallo TI")

L'affichage de texte couleur avec la simplicité d'un print(), un formidable avantage exclusif à ta TI-83 Premium CE ! :D

13971La calculatrice semble gérer 16 codes de commandes CSI permettant de régler 16 couleurs différentes, aussi bien pour la couleur de texte que la couleur de fond. Les codes CSI correspondant vont de 0 à 15 et pour 256 combinaisons possibles, illustrées ci-contre dans l'ordre par le script ci-dessous :
Code: Select all
def color_str(s, cf, cb=7):
  return "\x1B[" + str(cf) + ";" + str(cb) + "m" + s

n = 16
s = ""

for cb in range(n):
  for cf in range(n):
    s += color_str("X", cf, cb)
  if cb % 2: s += "\n"

Au-delà de l'ordre, cela ne correspond pas exactement à la palette de couleurs utilisables en langage TI-Basic.

En effet elles ne sont qu'au nombre de 15 alors qu'ici nous en avons 16, la couleur rajoutée semblant être le cyan.

Attention, cela ne fonctionne que sur les TI-83 Premium CE Edition Python et modèles similaires.

Cela ne marche pas sur les modèles plus anciens avec l'adaptateur TI-Python externe, ni sur les TI-Nspire CX II. :#non#:

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 05 Jun 2021, 13:17
by cent20
L'idée n'est pas mauvaise mais il est dommage de voir les scripts python ainsi se fragmenter.

C'était déjà bien compliqué avec les couches graphiques toutes différentes, et pas toutes complètes. Il ne faudrait pas revenir à la situation antérieur, pré-python, ou chaque constructeur avait son propre langage.

En tout cas, si de bons scripts sortent et exploitent intelligemment cette fonctionnalité, le rendu sur une autre calculatrice sera très décevant.

Image

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 05 Jun 2021, 14:53
by Bisam
On peut noter un effet pervers non désiré : les >>> introductifs des lignes de commande suivant celle du "print" spécial conservent les paramètres de couleur et de fond du précédent affichage.

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 05 Jun 2021, 14:59
by Adriweb
cent20 wrote:L'idée n'est pas mauvaise mais il est dommage de voir les scripts python ainsi se fragmenter.

C'était déjà bien compliqué avec les couches graphiques toutes différentes, et pas toutes complètes. Il ne faudrait pas revenir à la situation antérieur, pré-python, ou chaque constructeur avait son propre langage.

En tout cas, si de bons scripts sortent et exploitent intelligemment cette fonctionnalité, le rendu sur une autre calculatrice sera très décevant.

Image

Qui propose une PR à epsilon pour au moins gérer les couleurs? :D


Bisam wrote:On peut noter un effet pervers non désiré : les >>> introductifs des lignes de commande suivant celle du "print" spécial conservent les paramètres de couleur et de fond du précédent affichage.

Il suffit de mettre un reset a la fin du print, a priori

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 05 Jun 2021, 21:00
by critor
Bisam wrote:On peut noter un effet pervers non désiré : les >>> introductifs des lignes de commande suivant celle du "print" spécial conservent les paramètres de couleur et de fond du précédent affichage.


Il suffit juste de rerégler en noir sur fond blanc à la fin de tout affichage précédant un retour à la console :
print("\x1B[3;4mHallo TI\x1B[0;7m")
Image

On peut même mettre ça dans la fonction color_str(), et comme ça il n'y a même plus à s'en occuper.

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 06 Jun 2021, 09:49
by Bisam
Même si c'est plutôt chouette de pouvoir faire écrire en couleur, je trouve tout de même que ce formatage va totalement à l'encontre du Zen Python...

PEP 20 wrote:Préfère :
- la beauté à la laideur,
- l'explicite à l'implicite,
- le simple au complexe
- et le complexe au compliqué,
- le déroulé à l'imbriqué,
- l'aéré au compact.
Prends en compte la lisibilité.
Les cas particuliers ne le sont jamais assez pour violer les règles.[...]


Je suis sans doute un peu trop puriste.

Re: print en couleur via codes CSI sur TI-83 Premium CE Pyth

Unread postPosted: 06 Jun 2021, 13:59
by Adriweb
Ca devient parfaitement lisible et aéré si tu utilises des constantes genre red + "hello" ou ("{} hello" % red) ou des wrappers. La le code inline c'est juste pour montrer.