[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 12/12/2023 09:26 | #
Bonjour,
ma contribution pour exliquer comment j'utilise le getkey() avec PythonExtra
NB. je n'ai essayé que sur la Casio Graph 35+E II Monochrome
dclear(C_WHITE)
dtext(10,10,C_BLACK,"haut ou bas ou Exit")
dupdate()
while True:
k=getkey().key
if k==KEY_UP:
dclear(C_WHITE)
dtext(10,10,C_BLACK,"haut")
dupdate()
if k==KEY_DOWN:
dclear(C_WHITE)
dtext(10,10,C_BLACK,"bas")
dupdate()
if k==KEY_EXIT:
break
https://joz.alwaysdata.net/info/
Citer : Posté le 15/12/2023 19:43 | #
Mercifully Pitijoz! Ca marche parfaitement j'ai réussi à faire un jeu de morpion et je compte le poster sur le site ASAP.
Citer : Posté le 15/12/2023 19:47 | #
Sinon j'ai une autre question, comment je fais pour créé un sprite avec gint? J'ai fais une classe, mais comment je fais pour l'afficher à l'écran en un seul "sprite"? (Je suis en train de faire un flappy Bird, mais shhh )
Citer : Posté le 15/12/2023 19:49 | #
Il faut que j'ajoute un peu de support ! J'ai dit que c'était prévu mais je cours un peu derrière ma liste de tâches ^^"
À la main tu peux générer une liste de couleurs et l'afficher avec dpixel(). Quand j'aurai fait le truc proprement y'aura un script pour convertir un PNG en un bout de code magique et tu pourras appeler dimage() dessus.
Citer : Posté le 15/12/2023 20:48 | #
Alors si j'ai bien compris, mon oiseau serais juste un pixel ou un carré de 4 pixel? Sinon, Merci pour ta réponse rapide
Citer : Posté le 15/12/2023 20:49 | #
Bien plus ? Enfin si tu veux en avoir 1 ou 4 tu peux, mais les limites sont plus hautes.
Caltos : G35+EII, G90+E (briquée )
Citer : Posté le 15/12/2023 21:56 | #
Je voulais dire que tu peux faire une liste de couleurs et ensuite afficher chaque pixel avec dpixel(). Donc si ton sprite fait 16x16 par exemple, tu appellerais dpixel() 16×16 = 256 fois.
Citer : Posté le 15/12/2023 22:59 | #
Oui, c'est ça que je voulais dire
Citer : Posté le 16/12/2023 11:12 | #
Bonjour
Quelques petites questions en pythonextra :
* En termes de performances, lorsqu'on veut ré-afficher un objet qui se déplace, vaut-il mieux effacer tout l'écran et tout redessiner ou juste effacer et redessiner la partie que l'on veut modifier ?
* Sur Casio 35E+EII mono comment utiliser C_DARK, C_NONE et C_LIGHT ?
* Si un script python est dans un répertoire, et qu'i y a des "import" ça ne fonctionne pas. Pensez-vous que ce problème sera réglé ?
* Au sujet de "donnée est protégée" je reproduis le bug de cette façon :
Dans un script avec python normal, si je rentre ce code :
et EXE
j'ai le message SyntaxError : Invalid syntax
si j'exécute ce code dans pythonExtra j'obtiens le même message d'erreur
c'est à ce moment-là, je pense, que PythonExtra ne sait pas refermer le fichier et je ne peux plus le modifier ni le supprimer depuis Python normal (à moins de faire un reset) au dos de la machine
Désolé de prendre de votre temps ..
https://joz.alwaysdata.net/info/
Citer : Posté le 16/12/2023 14:54 | #
Je pourrai repondre a la derniere question
c'est à ce moment-là, je pense, que PythonExtra ne sait pas refermer le fichier et je ne peux plus le modifier ni le supprimer depuis Python normal (à moins de faire un reset) au dos de la machine
Ca m'est deja arriver, et il suffit d'attendre un petit peu de temps (environ 20 minutes) et ca passera. Et normalement, si tu l'eteint ( SHIFT et AC/ON ), le probleme devrais partir. Si ca ne marche pas, je ne sais pas.
Citer : Posté le 16/12/2023 15:24 | #
* En termes de performances, lorsqu'on veut ré-afficher un objet qui se déplace, vaut-il mieux effacer tout l'écran et tout redessiner ou juste effacer et redessiner la partie que l'on veut modifier ?
Avec un overhead raisonable c'est évidamment plus rapide de redessiner l'unique partie qui s'est déplacée quand on a un rendu CPU (avec une GPU ça peut être discutable)
Pour le reste je laisserais un membre plus qualifié sur le sujet répondre (Lephe/Sly)
Caltos : G35+EII, G90+E (briquée )
Citer : Posté le 16/12/2023 15:51 | #
Sinon, quand j'essaye d'ouvrir un fichier de 6292 octets et il me donne un message d'erreur : " failed allocating 512 bytes " vous savez comment faire?
Citer : Posté le 16/12/2023 16:33 | #
Ok, petit résumé pour moi des requêtes récentes pour voir ce que je peux faire marcher cet après-midi.
- Fonction de dessin de cercle (Ptitjoz #194511)
- Bug sur l'émulateur (Ptitjoz #194519)
- Fonction de dessin d'image (Ena0 #194556, Tuper4 #194749)
- Compatibilité avec turtle (Tuper4 #194656)
- Moteur de gris (Ptitjoz #194757)
- Correction du bug des imports relatifs (Ptitjoz #194757)
- Correction de bug des fichiers mal fermés (Ptitjoz #194757)
Pour les questions récentes...
Là tout de suite ce sera plus rapide de redessiner que ce qui a bougé, mais c'est très chiant à faire en général. Dans les add-ins je défends la position que les perfs devraient être suffisantes pour qu'on puisse se permettre de tout redessiner à chaque frame, ce qui est généralement le cas. Avec PythonExtra ce le sera peut-être une fois que dimage() sera disponible.
Oui c'est un bug et je vais le corriger.
Merci pour ta description du problème sur les fichiers, je vais regarder ça !
Sur Graph 35+E II j'imagine ? Tu es tombé à court de mémoire. Il n'y a pas vraiment de solution dans l'immédiat. Actuellement PythonExtra sur Graph 35+E II a accès à peu de mémoire ce qui est casse-pieds, mais je sais où on peut aller en chercher plus. Ça vient (doucement ça par contre)
Citer : Posté le 16/12/2023 17:34 | #
Ok merci! Alors j'attends, doucement...
Citer : Posté le 16/12/2023 23:22 | #
Turns out déjà les imports depuis un sous-dossier c'était pas facile.
Donc le fait que import b dans folder/a.py essaie d'importer depuis la racine au lieu d'importer folder/b.py n'est pas juste de ma faute, apparemment. Je suis à peu près sûr que c'est comme ça que MicroPython est construit, à cause de cette page de doc ("MicroPython also doesn't have a notion of "current directory", so relative imports don't work.") et ce thread de 2020.
Essentiellement il faudrait écrire from . import b pour que MicroPython soit content. Mais comme l'appli Python officielle de CASIO supporte la version import b, eh ben je veux avoir ça aussi.
J'ai passé un moment à bien comprendre comment les imports se font pour trouver le bon endroit où je pouvais enregistrer la liste des modules en cours d'exécution (ie. me souvenir de folder/a.py) et ainsi avoir sous la main le chemin d'où partir pour les autres imports.
Il me reste à trouver comment m'insérer au bon endroit dans la logique de recherche du .py et ce sera bon. Demain, probablement.
Citer : Posté le 17/12/2023 11:48 | #
Ok et merci pour le travail que tu mettras . Donc je pourrai même utiliser la bibliothèque Turtle avec PythontExtra .
Citer : Posté le 19/12/2023 22:32 | # | Fichier joint
Ok donc déjà un début ! Doucement mais sûrement. La version ci-jointe fait des imports relatifs. Donc par exemple dans la situation :
|- a.py
'- b.py
Si on lance a.py depuis le menu et que a.py utilise "import b", folder/b.py sera importé.
Ce sera dans la prochaine version mais si vous pouvez tester par rapport à vos cas d'usage dès maintenant pour voir si j'ai oublié des choses, ce serait super.
Citer : Posté le 19/12/2023 22:46 | #
Je vais l'essayer des que possible et je te tiendrai su courant
Par contre, je suis occupé en ce moment donc je pourrais l'essayer environ la semaine prochaine. DSL pour les inconvéniences.
Citer : Posté le 21/12/2023 08:34 | #
Merci Lephe, Je regarderai dès que possible.
Par contre sur l'émulateur, il faudra sans doute renommer PythonExtra.g1a car la G35 n'aime pas les noms de fichiers trop longs. (8.3) ?
https://joz.alwaysdata.net/info/
Citer : Posté le 23/12/2023 10:47 | #
Ok donc déjà un début ! Doucement mais sûrement. La version ci-jointe fait des imports relatifs. Donc par exemple dans la situation :
|- a.py
'- b.py
Si on lance a.py depuis le menu et que a.py utilise "import b", folder/b.py sera importé.
Ce sera dans la prochaine version mais si vous pouvez tester par rapport à vos cas d'usage dès maintenant pour voir si j'ai oublié des choses, ce serait super.
Bonjour sur la graph35+EII
je n'arrive même plus à faire un import au même niveau de la racine
par exemple
le fichier tlib.py qui contient
et le fichier tbug.py qui contient
print(pi)
print("ok ?")
j'obtiens ce message
ImportError:no module named 'tlib'
Bien à toi
https://joz.alwaysdata.net/info/
Citer : Posté le 23/12/2023 12:09 | # | Fichier joint
Merci pour le test Ptitjoz, juste une erreur bête de ma part (quand le dernier fichier importé est folder/tbug.py il cherche tlib dans le dossier folder/, mais quand le dernier fichier importé était tbug.py ne voyant pas de slash il cherchait tlib dans le "dossier" tbug.py/). x)
J'ai corrigé, vois ci-joint. J'ai aussi renommé le g1a en PythonEx.g1a pour t'éviter le problème avec l'émulateur.