Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » [Bêta] PythonExtra.
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

[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


Précédente 1, 2, 3 ··· 5, 6, 7, 8, 9, 10, 11 ··· 20, 21, 22 Suivante
Ptitjoz Hors ligne Membre Points: 261 Défis: 10 Message

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


from gint import *

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

Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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.
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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 )
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Fcalva En ligne Membre Points: 600 Défis: 10 Message

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.
Pc master race - Apréciateur de Noctua moyen
Caltos : G35+EII, G90+E (briquée )
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

Citer : Posté le 15/12/2023 22:59 | #


Oui, c'est ça que je voulais dire
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Ptitjoz Hors ligne Membre Points: 261 Défis: 10 Message

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 :
print("bug)

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 ..
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

Citer : Posté le 16/12/2023 14:54 | #


Je pourrai repondre a la derniere question
Ptitjoz a écrit :
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.
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Fcalva En ligne Membre Points: 600 Défis: 10 Message

Citer : Posté le 16/12/2023 15:24 | #


Ptitjoz a écrit :

* 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)
Pc master race - Apréciateur de Noctua moyen
Caltos : G35+EII, G90+E (briquée )
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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?
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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...

* 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 ?

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.

* 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é ?

Oui c'est un bug et je vais le corriger.

Merci pour ta description du problème sur les fichiers, je vais regarder ça !

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?

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)
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

Citer : Posté le 16/12/2023 17:34 | #


Ok merci! Alors j'attends, doucement...
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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 .
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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 :

folder/
|- 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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tuper4 Hors ligne Membre Points: 889 Défis: 19 Message

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.
When the doorbell rings at three in the morning, it’s never good news. -Anthony Horowitz
Ptitjoz Hors ligne Membre Points: 261 Défis: 10 Message

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) ?
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Ptitjoz Hors ligne Membre Points: 261 Défis: 10 Message

Citer : Posté le 23/12/2023 10:47 | #


Lephenixnoir a écrit :
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 :

folder/
|- 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
from math import pi

et le fichier tbug.py qui contient
from tlib import *
print(pi)
print("ok ?")

j'obtiens ce message
File "tbug.py", line 1, in <module>
ImportError:no module named 'tlib'


Bien à toi
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Précédente 1, 2, 3 ··· 5, 6, 7, 8, 9, 10, 11 ··· 20, 21, 22 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 103 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

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