[Bêta] PythonExtra.
Posté le 29/10/2022 09:49
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.
Version Bêta 0.2
Graph 35+E II / Prizm / Graph 90+E : PythonExtra-pe-0.2.0-beta.zip
Aperçu de PythonExtra sur Graph 90+E. (Cliquez pour agrandir)
Description sommaire des fonctionnalités :
- 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.
Dépôt Git :
https://gitea.planet-casio.com/Lephenixnoir/PythonExtra
PythonExtra est notamment possible grâce à l'aide précieuse de
Mb88.
Comparaison directe
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 !)
Fichier joint
Citer : Posté le 26/12/2022 18:32 | #
Hello again, où en est actuellement le support de la fonction open() ?
Dès qu'on l'appelle, on a une erreur comme quoi on doit fournir comme argument un tuple, et non une chaine , du coup j'ai mis tous mes arguments en un tuple :
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 26/12/2022 18:34 | #
Pour l'instant ce n'est pas supposé marcher, il y a des tests sur une branche du dépôt mais il faudra y repasser quelques efforts avant de pouvoir le faire marcher. La lecture des fichiers demande du travail que côté Python mais l'écriture en demandera aussi un peu côté gint.
Citer : Posté le 29/12/2022 17:34 | #
peut-on installer PythonExtra.g3a sur clé casio USB ? Je n'y parviens pas.
merci.
Citer : Posté le 29/12/2022 17:37 | #
Le simulateur sur clé USB ne supporte pas les add-ins, malheureusement. On peut l'installer sur l'émulateur officiel (le fx-CG Manager) par contre. Je me souviens de bugs remontés dans ce cas, mais je ne sais pas si c'est l'add-in qui est responsable ou l'émulateur.
Citer : Posté le 25/01/2023 12:49 | #
@Mb88 A-t-on une façon reproductible de tester le problème de fichiers non fermés ? Je sais que tu l'as observé plusieurs fois, mais je n'ai pas pu le reproduire de mon côté encore.
Citer : Posté le 25/01/2023 18:39 | #
Je suis en train de chercher sur ce problème. Récemment j'ai d'ailleurs découvert un problème de compat casioplot (je mettrai le code bientôt sur le dépot).
Pour le faire t'ouvre un fichier py dans PE plusieurs fois (à chaque fois tu relances PE), et au bout d'un moment quand t'essayes d'enregistrer le fichier dans l'éditeur python intégré, et que tu l'enregistres tu auras un message d'erreur.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 25/01/2023 19:46 | #
Ah j'ai vu que t'avais écrit dans la discussion sur github.
Apparemment il faut appeler gc_sweep_all() à la fin de l'exécution.Je crois que j'ai pas tout bien lu .libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 26/01/2023 21:41 | #
Je suis en train de chercher sur ce problème. Récemment j'ai d'ailleurs découvert un problème de compat casioplot (je mettrai le code bientôt sur le dépot).
Pour le faire t'ouvre un fichier py dans PE plusieurs fois (à chaque fois tu relances PE), et au bout d'un moment quand t'essayes d'enregistrer le fichier dans l'éditeur python intégré, et que tu l'enregistres tu auras un message d'erreur.
J'ai le même problème : data protégée ou un truc dans ce genre
EDIT (comme précisé sur le chat ) :
(charactère non valide suit à l'exécution ? )Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Danael Invité
Citer : Posté le 27/03/2023 09:26 | #
Um, je suis impressionné par ce module, mais j'ai pas réussi à trouver de la documentation pour le module "gint" qui permet d'avoir les inputs de la calculatrice en temps réel... Est-ce que quelqu'un pourrais m'aider ?
Citer : Posté le 27/03/2023 09:33 | #
Ouais j'ai pas vraiment documenté parce que c'est des fonctions de mon noyau/bibliothèque C que la majorité des gens connaissent. Oups ! x_x
Donc tu as les noms des touches comme définis dans <gint/keycodes.h>, par exemple tu as gint.KEY_EXE pour la touche EXE (c'est un entier mais peu importe, tu as juste besoin du nom).
Ensuite pour faire très simple, pour les entrées temps réel le plus simple c'est d'appeler gint.clearevents() une fois par frame, et ensuite tu peux utiliser gint.keydown() pour savoir si une touche est pressée. Par exemple pour interrompre le programme lorsque EXE est pressée :
# boucle du programme...
gint.clearevents()
if gint.keydown(gint.KEY_EXE):
break
Tu as des versions un peu plus subtiles dans les exemples du dépôt, par exemple celui-ci pour chute tridimensionnelle.
Content que PythonExtra te plaise !
Danael Invité
Citer : Posté le 27/03/2023 09:39 | #
Merci beaucoup
Citer : Posté le 22/11/2023 11:39 | #
Ouais j'ai pas vraiment documenté parce que c'est des fonctions de mon noyau/bibliothèque C que la majorité des gens connaissent. Oups ! x_x
Donc tu as les noms des touches comme définis dans <gint/keycodes.h>, par exemple tu as gint.KEY_EXE pour la touche EXE (c'est un entier mais peu importe, tu as juste besoin du nom).
Ensuite pour faire très simple, pour les entrées temps réel le plus simple c'est d'appeler gint.clearevents() une fois par frame, et ensuite tu peux utiliser gint.keydown() pour savoir si une touche est pressée. Par exemple pour interrompre le programme lorsque EXE est pressée :
# boucle du programme...
gint.clearevents()
if gint.keydown(gint.KEY_EXE):
break
Tu as des versions un peu plus subtiles dans les exemples du dépôt, par exemple celui-ci pour chute tridimensionnelle.
Content que PythonExtra te plaise !
Ouais j'ai pas vraiment documenté parce que c'est des fonctions de mon noyau/bibliothèque C que la majorité des gens connaissent. Oups ! x_x
Donc tu as les noms des touches comme définis dans <gint/keycodes.h>, par exemple tu as gint.KEY_EXE pour la touche EXE (c'est un entier mais peu importe, tu as juste besoin du nom).
Ensuite pour faire très simple, pour les entrées temps réel le plus simple c'est d'appeler gint.clearevents() une fois par frame, et ensuite tu peux utiliser gint.keydown() pour savoir si une touche est pressée. Par exemple pour interrompre le programme lorsque EXE est pressée :
# boucle du programme...
gint.clearevents()
if gint.keydown(gint.KEY_EXE):
break
Tu as des versions un peu plus subtiles dans les exemples du dépôt, par exemple celui-ci pour chute tridimensionnelle.
Content que PythonExtra te plaise !
Bonjour
J'ai essayé et ça fonctionne bien. Merci
Je n'ai pas trouvé où était la doc notamment pour getkey()
Bien à toi
https://joz.alwaysdata.net/info/
Citer : Posté le 22/11/2023 11:56 | #
Content que ça marche. La documentation de getkey() est dans <keyboard.h>, et tu peux regarder les fonctions adjacentes comme getkey_opt(). En cas de doute,dir(gint) dans MicroPython te listera toutes les constantes et fonctions disponibles dans le module.
Citer : Posté le 22/11/2023 12:11 | #
Content que ça marche. La documentation de getkey() est dans <keyboard.h>, et tu peux regarder les fonctions adjacentes comme getkey_opt(). En cas de doute,dir(gint) dans MicroPython te listera toutes les constantes et fonctions disponibles dans le module.
d'accord et merci de ta réponse
Bien à toi.
https://joz.alwaysdata.net/info/
Citer : Posté le 22/11/2023 18:45 | #
Quelques questions... si ce n'est pas là qu'il faut poster, dites-le-moi.
sur la Casio graph 35+E II avec le module gint
je dois mettre en paramètre couleur : 0 pour le blanc et 3 pour le noir ; par exemple dtext(1,1,3,"texte")
→je ne m'explique pas ce 3 .
J'ai fait un mini script qui me permet de voir à quoi correspondent les touches enfoncées :
from gint import *
dclear(0)
dtext(1,1,3,"test touche")
dupdate()
a=["time","mod","shift","alpha","type","touche"]
while True:
k=getkey()
dclear(0)
for i in range(0,6):
dtext(1,i*10,3,a[i])
dtext(60,i*10,3,str(k[i]))
dupdate()
→je me demande à quoi correspond mod ?
→et type passe de l'état 1 à 3 si on maintient les touches de direction (et pourquoi 3) ?
→La fonction drect_border(x1,y1,x2,y2,1,1,3) à quoi correspondent les paramètres 5 et 6 ? (angle chanfreiné et épaisseur ? (ou l'inverse)
En résumé, c'est assez compliqué à retrouver la doc et souvent, je vais en tâtonnant
Merci de votre patience :/
Bien à vous
https://joz.alwaysdata.net/info/
Citer : Posté le 22/11/2023 19:03 | #
Ça doit être une conséquence du moteur de gris pour le 0 et 3
Caltos : G35+EII, G90+E (briquée )
Citer : Posté le 22/11/2023 19:07 | #
C'est tout à fait le bon endroit pour poster. Les couleurs pour dtext() (et pour toutes les autres fonctions d'ailleurs) correspondent à l'énumération color_t. Le noir est 3 parce qu'il y a des gris clair et foncé en valeur 1 et 2, que tu peux manipuler avec le moteur de gris (je réalise que je ne l'ai pas exposé dans le module, mais je pourrais). Généralement tu auras plutôt envie d'écrire gint.C_BLACK que la valeur 3, c'est plus lisible.
Dans le doute tu peux consulter cette liste de toutes les fonctions et valeurs disponibles dans le module.
Concernant la valeur de retour de getkey(), la documentation correspondante est dans cette partie de <gint/keyboard.h>. mod indique si l'événement a été généré par une fonction qui sait appliquer les modifieurs (ie. getkey() par opposition à des fonctions plus bas niveau). C'est un champ plutôt ancien et cette signification est relativement peu utile maintenant.
Le passage de 1 à 3 correspond au fait que le champ type vient de cette énumération ; tu peux écrire gint.KEYEV_DOWN et gint.KEYEV_HOLD plutôt. On passe de 1 à 3 parce que la valeur 2 correspond aux relâchements des touches ; mais ceux-là getkey() les masque (les fonctions sur les événements te le montreront par contre).
Pour drect_border(), la définition est dans <display.h>, le 5ème paramètre est l'épaisseur de la bordure (interne) et le 6ème sa couleur. Il n'y a pas de fonction pour dessiner des angles arrondis ou chanfreinés.
De façon générale, si tu as un outil pour faire une recherche à travers plusieurs fichiers d'un coup, tu peux chercher les noms des types dans les fichiers .h de gint et retomber sur la documentation originale. Je reconnais que c'est pas très pratique ; désolé. Merci pour ta patience.
Citer : Posté le 27/11/2023 10:15 | # | Fichier joint
Merci pour toutes tes explications !
j'aurai encore beaucoup de questions, mais j'attends encore un peu pour les poser.
Sinon quelques retours de mes essais
D'après mes premiers essais, je trouve que Pythonextra correspond bien à mes attentes !
Ce que j'aime est qu'on ne puisse pas aller en édition dans le code et qu'on évite de le casser
le module gint et time sont vraiment performants. getkey time_ms() etc
et couplé avec ftune on, peut faire des choses sympas
j'aurais juste aimé avoir la fonction cercle() qui serait sans doute plus rapide que celle de Geolib ,mais pas une obligation non plus
La seule chose gênante est que je me suis souvent bloqué quand je veux enregistrer (via l'application Python officielle ) un fichier, j'ai le message "donnée est protégée " (pièce jointe) et je suis obligé d'enregistrer sous un autre nom et au final, j'ai une ribambelle de fichiers inutiles que je ne peux effacer que si je "reset "la machine au dos (Casio 35+EII)
un petit regret est qu'on ne peut pas travailler dans les dossiers et sous dossiers dès que l'on veut importer des modules personnels ; tout devant être à la racine, ça devient un peu le fouillis. Mais c'est sans doute une contrainte de micropy.
Autre point (à confirmer) la machine ne s'éteint que si on sort de l'application Python Extra). Le Shift OFF ne fonctionne pas.
Bien à toi
https://joz.alwaysdata.net/info/
Citer : Posté le 29/11/2023 11:53 | # | Fichier joint
Bonjour
juste pour info:
je viens d'essayer Pythonextra sur l'émulateur. j'ai juste du renommer PythonExtra.g1a en PEXTRA.g1a pour que ça soit reconnu.
Cela fonctionne (pièce jointe), mais si j'appuie sur les touches ça ralentit fortement... jusqu'à bloquer...
Rien de comparable avec la version sur la calculatrice avec laquelle, c'est jouable...
https://joz.alwaysdata.net/info/
Citer : Posté le 01/12/2023 18:08 | #
sinon, j'ai une question un peu bete: comment on fais pour ouvrir un fichier python qui est deja sur ma calculatrice par ce que quand je lance l'add in, et j'appuie sur F1, il ne montre pas de fichier. c'est normal?
j'ai une Casio graph 75 mais avant, c'etait une graph 35+e
Citer : Posté le 01/12/2023 18:55 | #
sinon, j'ai une question un peu bete: comment on fais pour ouvrir un fichier python qui est deja sur ma calculatrice par ce que quand je lance l'add in, et j'appuie sur F1, il ne montre pas de fichier. c'est normal?
j'ai une Casio graph 75 mais avant, c'etait une graph 35+e
je ne sais pas si PythonExtra fonctionne sur la graph 75 ou modifié (à priori, je dirais non).
PyhonExtra fonctionne sur Casio graph 35+ EII ou Casio graph 90E
Avec PythonExtra tu ne peux pas créer ou éditer les scripts python, tu ne peux que voir les scripts disponibles avec F1 et les exécuter (ou lancer) avec EXE une fois en surbrillance.
Pour créer/modifier tes scripts python, tu dois repasser par le "menu" et utiliser l'application python standard
Bien à toi
https://joz.alwaysdata.net/info/