PythonExtra est un add-in Python alternatif pour (à ce stade) Graph 35+E II, Prizm et Graph 90+E. L'objectif est de fournir plus de fonctionnalités : modules standard, getkey(), fonctions de dessin plus performantes, etc.
Compile pour Graph 90+E (fx-CG 10/20/50) et Graph 35+E II (fx-9860G III)
Peu de RAM sur Graph 35+E II (c'est difficile d'en trouver sur ce modèle)
Un shell pas trop mal (saisie rapide, scrolling) avec de bonnes performances
Plein de modules standard
array, builtins, cmath, collections, io, math, random, struct, sys, time
Le module spécifique CASIO : casioplot (fidèle à part sur les polices)
Un nouveau module gint avec les fonctionnalités avancées de gint :
Pour l'instant, une bonne partie de <gint/display.h> et <gint/keyboard.h>
Donc getkey() (attente de touche) ainsi que keydown() (test instantané) !
Et des fonctions de dessin rapides comme dline() ou drect()
Le plan actuel :
Être sensiblement compatible avec l'appli Python officielle.
Pousser les fonctionnalités ajoutées pour vraiment relever le niveau de Python !
Si du temps de développement se débloque : support autres Graph mono (pas de promesses).
Updates et screenshots à venir. Je n'ai pas l'intention d'implémenter un million de fonctionnalités, juste ce qu'il faut pour s'assurer que ça ne finisse pas mal documenté et non maintenu comme CasioPython.
Dans l'exemple ci-dessous (réalisé par Mb88), un Flappy Bird déjà bien optimisé (dessin partiel etc, à gauche) est accéléré un bon gros coup en utilisant PythonExtra et le module gint pour le dessin (à droite).
Contexte historique
Aux journées APMEP 2022, redgl0w racontait comment le port MicroPython pour Numworks n'était finalement pas super difficile. Moi je parlais de comment un port maison résoudrait le problème de getkey(), et Critor m'a convaincu d'essayer sur-le-champ.
En fin de compte, j'ai clôné MicroPython Dimanche à midi et à 1 heure du matin j'avais un port fonctionnel avec getkey() sur ma Graph 90+E (que j'ai d'ailleurs montré à CASIO Lundi, pour la démo). Comme quoi, des fois ça marche tout seul !
(Enfin, le début marche tout seul. Faire une bonne UI et gérer tous les détails ensuite c'est une autre paire de manches !)
Le support du fxCP 400 est top. C'est l'ouverture de cette machine au Python, ce qui n'existait pas jusqu'à présent. C'est donc une date à marquer d'une pierre rouge.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Moi je suis en train de coder un éditeur pour fx et j'ai déjà fait un petit bout de code pour le tester (j'ai pas encore testé si ce code marche correctement avec micropython on calc oui c'est bon il fonctionne correctement):
from random import randint as r
# Some code in a comment: for i in range(10)
"""
A docstring with some code:
if not 1 in [1] and 1 is not None: print("Ok!")
"""
# Some code:
a = int(1000*2/2*10**0+1%1//1)
b = int(a*2/2*10**0+1%1//1)
class Test: # A useless class
def __init__(self, something: int):
self.hello = "Hello"
self._something = something
self.__private = 2.1e9
def say_hi(self) -> None:
print(f"Hi! A number: {self._something}.")
class RandomNumber(Test): # Something is random
def __init__(self):
super().__init__(r(1, 100))
Hello petite question, est-ce qu'il y a moyen de poser un pixel très rapidement comme en C++ avec gint_vram ou c'est pas possible ? Car dpixel si je ne me trompe pas fait a chaque fois une vérification des bordures non (et du coup c'est lent) ?
"La créativité est contagieuse faites la tourner" Albert Einstein
Dark et Light correspondent "vraiment" à des couleurs (gris foncé et gris clair) respectivement, tandis que Darken et Lighten augmentent et diminuent respectivement la couleur
darken fait passer : WHITE > LIGHT > DARK > BLACK
lighten fait passer : BLACK > DARK > LIGHT > WHITE
tu peux voir l'effet en superposant des dessins de formes par exemple
Dans un car tu auras la couleur que tu veux sans s'occuper de ce qui était avant, dans l'autre tu auras un décalage de couleur qui prendra en compte l'image précédente.
Pas facile à expliquer cette affaire (Note, c'est le même fonctionnement que le moteur de gris de gint)
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
merci pour les explications.
Pour le moteur de gris
si j'ai bien compris la doc, le gris n'existe pas vraiment ? c'est une illusion d'otique (persistance rétinienne) ; le moteur de gris affiche le noir un certain temps et l'efface et c'est en boucle ; l'idée est bien trouvée. on le constate d'avantage avec des grandes surfaces où on voit le balayage et si on joue avec ftune c'est plus ou moins flagrant.
quand à émulateur sur ma vielle machine l'écran clignote plus ou moins et ça ne ne fonctionne pas vraiment.
Pour les fonts j'ai du renommer les fichiers car les noms étaient trop longs pour l'émulateur et ça fonctionne bien
Oui c'est ça, le moteur de gris est une illusion. Les paramètres actuels ne sont pas optimaux, mais ça marche bien si on fait attention à la quantité de gris à l'écran. Sur les modèles avec un écran moins bon (notamment des TI de l'époque) l'illusion est si bonne qu'on ne la voit pas du tout, mais ce n'est pas le cas sur les CASIO.
Autre petite question, est-ce qu'il est possible de draw une image (plus précisément une subimage) en miroir (flip horizontal) ? (sans a avoir a recréer une image en inversé)
vu qu'il n'y a plus les flag, je voulais savoir s'il y avait un autre moyen
"La créativité est contagieuse faites la tourner" Albert Einstein
J'ai failli l'ajouter aujourd'hui mais y'a encore des subtilités sur l'intégration. Pas dit que je puisse le fournir d'ici Dimanche. Tu as deux workarounds possibles pour l'instant, à savoir préconvertir l'image retournée, ou générer le miroir en Python en construisant le bytes qui va bien. Si ça ne marche pas pour ton cas d'usage, je peux essayer de refaire un coup sur le module demain.
Je cherche à avoir de bonnes performances et que ça soit léger, dans l'idéal ça serait bien de l'avoir, car j'ai les sprites de mon perso dans un sens, ça éviterait de dupliquer ou de créer un goulot d'étranglement pour régénérer les spirites. Surtout que j'ai aussi les sprites de la map.
Donc si ça ne te prend pas beaucoup de temps à l'ajouter nativement, ça m'aiderait en effet.
"La créativité est contagieuse faites la tourner" Albert Einstein
Petite question, je suppose que, maintenant qu'il y a un moteur de gris, on ne peut pas afficher avec dimage() des images en grayscale ? et qu'on est toujours limité au noir et blanc par cette méthode
Par contre je suis en train de me demander (j'ai jamais utilisé dans gint en fait), au niveau de la conversion avec fxconv, il y a un truc à spécifier pour le format des images pour être soit en N&B ou en 4 tons de gris ?
Ou alors on est tout le temps en 4 tons et quand le moteur de gris est inactif alors (DARK ou NOIR) donnent NOIR et (LIGHT ou BLANC) donnent BLANC ?
Je ne me souviens pas d'avoir vu des formats pour les monochromes.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Y'a des formats fxconv pour les monochromes. Je sais plus ce qui se passe si tu essaies de dessiner une image grise quand le moteur est inactif mais je ne vois pas de version de la fonction interne pour "approximer" le gris donc je pense que ça doit juste ignorer l'image et ne rien dessiner (i.e. erreur).
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 19/04/2025 09:20 | #
Merci beaucoup Lephe.
Super boulot de MaJ.
Le support du fxCP 400 est top. C'est l'ouverture de cette machine au Python, ce qui n'existait pas jusqu'à présent. C'est donc une date à marquer d'une pierre rouge.
Citer : Posté le 19/04/2025 12:58 | #
Wow ça avance super bien! Je commence à coder un éditeur de python pour FX
Citer : Posté le 19/04/2025 13:26 | #
Moi j'ai commencé un truc pour CG et CP.
Peut être pour la v0.5.0
Who knows
Citer : Posté le 19/04/2025 13:52 | #
(c'est un moteur de coloration syntaxique)
Citer : Posté le 19/04/2025 13:59 | #
J'ai vu le screenshot, ça a l'air magnifique.
Moi je suis en train de coder un éditeur pour fx et j'ai déjà fait un petit bout de code pour le tester (
j'ai pas encore testé si ce code marche correctement avec micropython on calcoui c'est bon il fonctionne correctement):# Some code in a comment: for i in range(10)
"""
A docstring with some code:
if not 1 in [1] and 1 is not None: print("Ok!")
"""
# Some code:
a = int(1000*2/2*10**0+1%1//1)
b = int(a*2/2*10**0+1%1//1)
class Test: # A useless class
def __init__(self, something: int):
self.hello = "Hello"
self._something = something
self.__private = 2.1e9
def say_hi(self) -> None:
print(f"Hi! A number: {self._something}.")
class RandomNumber(Test): # Something is random
def __init__(self):
super().__init__(r(1, 100))
random = RandomNumber()
random.say_hi()
i = 0
while (i := i+1) <= 100: print(i)
Citer : Posté le 19/04/2025 21:16 | #
Hello petite question, est-ce qu'il y a moyen de poser un pixel très rapidement comme en C++ avec gint_vram ou c'est pas possible ? Car dpixel si je ne me trompe pas fait a chaque fois une vérification des bordures non (et du coup c'est lent) ?
Albert Einstein
Citer : Posté le 19/04/2025 21:22 | #
Non, tu n'as pas accès à la VRAM directement depuis PythonExtra.
Citer : Posté le 21/04/2025 19:03 | #
ah super cette mise à jour ! Merci à Lephe et à tous ceux qui ont participé à ce travail.
sur la casio graph 35+ EII j'ai commencé à voir les nouveautés ou intégrations (Fonts, moteur de gris et Files)
Je ferai un retour à l'occasion.
pour le moteur de grisje ne saisis pas les différences entre dark darken light et lighten
Citer : Posté le 21/04/2025 19:11 | #
Dark et Light correspondent "vraiment" à des couleurs (gris foncé et gris clair) respectivement, tandis que Darken et Lighten augmentent et diminuent respectivement la couleur
darken fait passer : WHITE > LIGHT > DARK > BLACK
lighten fait passer : BLACK > DARK > LIGHT > WHITE
tu peux voir l'effet en superposant des dessins de formes par exemple
Dans un car tu auras la couleur que tu veux sans s'occuper de ce qui était avant, dans l'autre tu auras un décalage de couleur qui prendra en compte l'image précédente.
Pas facile à expliquer cette affaire
Citer : Posté le 21/04/2025 21:42 | #
Hello !
Petite question, est-ce qu'il y a moyen de décharger une image chargé avec : img = gint.image(...) ?
Albert Einstein
Citer : Posté le 21/04/2025 21:54 | #
Tu peux del l'image. J'ai repassé le code tout à l'heure et ça doit détruire aussi les bytes qui vont avec.
Citer : Posté le 21/04/2025 22:52 | #
merci pour les explications.
Pour le moteur de gris
si j'ai bien compris la doc, le gris n'existe pas vraiment ? c'est une illusion d'otique (persistance rétinienne) ; le moteur de gris affiche le noir un certain temps et l'efface et c'est en boucle ; l'idée est bien trouvée. on le constate d'avantage avec des grandes surfaces où on voit le balayage et si on joue avec ftune c'est plus ou moins flagrant.
quand à émulateur sur ma vielle machine l'écran clignote plus ou moins et ça ne ne fonctionne pas vraiment.
Pour les fonts j'ai du renommer les fichiers car les noms étaient trop longs pour l'émulateur et ça fonctionne bien
Citer : Posté le 21/04/2025 23:10 | #
Oui c'est ça, le moteur de gris est une illusion. Les paramètres actuels ne sont pas optimaux, mais ça marche bien si on fait attention à la quantité de gris à l'écran. Sur les modèles avec un écran moins bon (notamment des TI de l'époque) l'illusion est si bonne qu'on ne la voit pas du tout, mais ce n'est pas le cas sur les CASIO.
Citer : Posté le 21/04/2025 23:13 | #
Autre petite question, est-ce qu'il est possible de draw une image (plus précisément une subimage) en miroir (flip horizontal) ? (sans a avoir a recréer une image en inversé)
vu qu'il n'y a plus les flag, je voulais savoir s'il y avait un autre moyen
Albert Einstein
Citer : Posté le 21/04/2025 23:16 | #
J'ai failli l'ajouter aujourd'hui mais y'a encore des subtilités sur l'intégration. Pas dit que je puisse le fournir d'ici Dimanche. Tu as deux workarounds possibles pour l'instant, à savoir préconvertir l'image retournée, ou générer le miroir en Python en construisant le bytes qui va bien. Si ça ne marche pas pour ton cas d'usage, je peux essayer de refaire un coup sur le module demain.
Citer : Posté le 21/04/2025 23:24 | #
Je cherche à avoir de bonnes performances et que ça soit léger, dans l'idéal ça serait bien de l'avoir, car j'ai les sprites de mon perso dans un sens, ça éviterait de dupliquer ou de créer un goulot d'étranglement pour régénérer les spirites. Surtout que j'ai aussi les sprites de la map.
Donc si ça ne te prend pas beaucoup de temps à l'ajouter nativement, ça m'aiderait en effet.
Albert Einstein
Citer : Posté le 21/04/2025 23:34 | #
Ok je regarde d'ici demain soir, je crois que je peux ajouter qu'une partie de l'API pour satisfaire ton besoin immédiat en esquivant les difficultés.
Citer : Posté le 22/04/2025 16:44 | #
Petite question, je suppose que, maintenant qu'il y a un moteur de gris, on ne peut pas afficher avec dimage() des images en grayscale ? et qu'on est toujours limité au noir et blanc par cette méthode
Citer : Posté le 22/04/2025 18:38 | #
Si tu peux, une fois que tu actives le moteur de gris, toutes les fonctions de dessin deviennent des fonctions 4 couleurs.
Citer : Posté le 22/04/2025 18:42 | #
Par contre je suis en train de me demander (j'ai jamais utilisé dans gint en fait), au niveau de la conversion avec fxconv, il y a un truc à spécifier pour le format des images pour être soit en N&B ou en 4 tons de gris ?
Ou alors on est tout le temps en 4 tons et quand le moteur de gris est inactif alors (DARK ou NOIR) donnent NOIR et (LIGHT ou BLANC) donnent BLANC ?
Je ne me souviens pas d'avoir vu des formats pour les monochromes.
Citer : Posté le 22/04/2025 19:27 | #
Y'a des formats fxconv pour les monochromes. Je sais plus ce qui se passe si tu essaies de dessiner une image grise quand le moteur est inactif mais je ne vois pas de version de la fonction interne pour "approximer" le gris donc je pense que ça doit juste ignorer l'image et ne rien dessiner (i.e. erreur).