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 - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » chiffres 1 à 9 en python extra sur graph 35+ EII
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

chiffres 1 à 9 en python extra sur graph 35+ EII

Posté le 18/05/2024 10:50

Avec python extra je me suis amusé ce matin à coder les chiffres de 0 à 9 de 5 pixels de haut et 4 pixel de large.

from gint import *
c=[[[1,1,1,1],[1,0,0,1],[1,0,0,1],[1,0,0,1],[1,1,1,1]],[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],[[1,1,1,1],[0,0,0,1],[1,1,1,1],[1,0,0,0],[1,1,1,1]],[[1,1,1,1],[0,0,0,1],[0,1,1,1],[0,0,0,1],[1,1,1,1]],[[1,0,0,1],[1,0,0,1],[1,1,1,1],[0,0,0,1],[0,0,0,1]],[[1,1,1,1],[1,0,0,0],[1,1,1,1],[0,0,0,1],[1,1,1,1]],[[1,1,1,1],[1,0,0,0],[1,1,1,1],[1,0,0,1],[1,1,1,1]],[[1,1,1,1],[1,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],[[1,1,1,1],[1,0,0,1],[1,1,1,1],[1,0,0,1],[1,1,1,1]],[[1,1,1,1],[1,0,0,1],[1,1,1,1],[0,0,0,1],[1,1,1,1]]]
dclear(0)
for n in range(10):
    for y in range(5):
        for x in range(4):
            if c[n][y][x]==1:dpixel(x+n*8+0,y,3)
dupdate()
k=getkey()


voici ce que ça donne :



ça n'a pas trop d''intérêt si ce n''est pour comprendre les listes...


Cakeisalie5 En ligne Ancien administrateur Points: 1945 Défis: 11 Message

Citer : Posté le 18/05/2024 10:53 | #


Tu peux tenter une optimisation commune : tente-le en encodant chaque chiffre sur 7 segments. Tu peux trouver les détails sur Internet
Respirateur d'air, BDFL de Cahute, des utilitaires de communication pour calculatrices CASIO.


Mon blogMes autres projets
Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 18/05/2024 11:58 | #


J'aime bien le style ! Tu peux faire un chouille plus compact avec le format d'images.

from gint import *
img_digits = image(0, 40, 5, b'\xf1\xff\x9f\xff\xff\x00\x00\x00\x91\x11\x98\x89\x99\x00\x00\x00\x91\xf7\xff\xf1\xff\x00\x00\x00\x91\x81\x11\x91\x91\x00\x00\x00\xf1\xff\x1f\xf1\xff\x00\x00\x00')
dclear(0)
for n in range(10):
    dsubimage(n*8, 0, img_digits, 4*n, 0, 4, 5)
dupdate()
getkey()

Avec --py-compact on gagne encore 120 octets (mais je l'ai pas fait parce que le texte se copie pas bien).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 18/05/2024 12:19 | #


Cakeisalie5 a écrit :
Tu peux tenter une optimisation commune : tente-le en encodant chaque chiffre sur 7 segments. Tu peux trouver les détails sur Internet

merci de tes suggestions je regarderai à l'occasion

Lephenixnoir a écrit :
J'aime bien le style ! Tu peux faire un chouille plus compact avec le format d'images.

[...]

Avec --py-compact on gagne encore 120 octets (mais je l'ai pas fait parce que le texte se copie pas bien).


Merci d'avoir pris le temps de regarder et d'expliquer d'autres méthodes
j'ai essayé ton code mais j'ai le message name "image" isn't defined.

--py-compact je ne connais pas. c'est un outil de Planer Casio ?
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 18/05/2024 12:24 | #


Les images ont été ajoutées dans la dernière version publiée mi-Mars.

La conversion de format est pour l'instant proposée par fxconv (un outil du fxSDK) et --py-compact est une option de fxconv qui produit un code compact pour charger l'image. L'inconvénient est que le code en question n'est pas affichable en texte traditionnel, donc il faut le mettre dans un autre .py auquel on ne touche pas. L'avantage c'est que ça prend moins de place et de mémoire.

Tu peux avoir plus de détails sur les images dans la documentation.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 18/05/2024 15:15 | #


merci de tes renseignements. dans mon émulateur j'avais une ancienne version de PE et maintenant ça fonctionne.
C'est vrai que le script passe de 692 à 309 bytes ce qui est remarquable !

j'ai récupéré l'image de la doc et dans un terminal quand j'essaie de la convertir ça ne fonctionne pas.

mais j'ai sans doute des trucs bancales sur mon ordi

de plus je ne sais pas récupérer une image depuis le code sans passer par une copie d'écran.

Edit je n'avais pas la bonne image mais ça ne change rien quand je télécharge https://git.planet-casio.com/Lephenixnoir/PythonExtra/raw/branch/main/ports/sh/examples/fx_image_7seg.png
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 18/05/2024 15:32 | #


Ah j'ai laissé le support de PythonExtra dans fxconv sur la branche dev du SDK... si tu as installé avec GiteaPC tu peux juste taper giteapc install Lephenixnoir/fxsdk@dev et ça devrait te donner la bonne version.

Oui le code est assez compact avec ça ce qui devient important pour faire des programmes ou jeux qui ne deviennent pas immenses quand on rajoute beaucoup d'images
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 18/05/2024 15:57 | #


j'ai fait la mise _à jour : 7seg.py généré (sans --py-compact pour l'instant)
voir code généré
Cliquer pour enrouler
import gint
seg = gint.image(0, 79, 12, b'|\x00||\x00|||||\x00\x00\xba\x02::\x82\xb8\xb8:\xba\xba\x00\x00\xc6\x06\x06\x06\xc6\xc0\xc0\x06\xc6\xc6\x00\x00\xc6\x06\x06\x06\xc6\xc0\xc0\x06\xc6\xc6\x00\x00\x82\x02\x02\x02\x82\x80\x80\x02\x82\x82\x00\x00\x00\x00|||||\x00||\x00\x00\x82\x02\xb8:::\xba\x02\xba:\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xba\x02\xb8:\x02:\xba\x02\xba:\x00\x00|\x00||\x00||\x00||\x00\x00')


Edit 1 à l'affichage :

NB j'avais une syntaxe erreur car mon fichier pour afficher commençait par un chiffre 7seg2.py et j'ai mis seg2.py

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

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

Citer : Posté le 18/05/2024 17:01 | #


Lephenixnoir a écrit :
J'aime bien le style ! Tu peux faire un chouille plus compact avec le format d'images.

from gint import *
img_digits = image(0, 40, 5, b'\xf1\xff\x9f\xff\xff\x00\x00\x00\x91\x11\x98\x89\x99\x00\x00\x00\x91\xf7\xff\xf1\xff\x00\x00\x00\x91\x81\x11\x91\x91\x00\x00\x00\xf1\xff\x1f\xf1\xff\x00\x00\x00')
dclear(0)
for n in range(10):
    dsubimage(n*8, 0, img_digits, 4*n, 0, 4, 5)
dupdate()
getkey()

Avec --py-compact on gagne encore 120 octets (mais je l'ai pas fait parce que le texte se copie pas bien).


je n'ai pas compris comment tu procèdes pour compacter le code sans passer par une image....
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 18/05/2024 17:11 | #


Les données de l'image sont fournies à travers un objet de type bytes écrit sous la forme b'...'. Les contenus sont donnés en syntaxe "chaîne de caractères" entre les apostrophes. Par exemple, dans 7seg.py, tu peux voir un certain nombre de "|" dans les données, ce qui représente un octet de valeur 0x7c = 124. Le caractère prend un octet dans le fichier .py, et il représente un octet de données, ce qui est parfait (c'est compact).

Malheureusement, la syntaxe chaîne de caractères ne permet normalement de saisir que les caractères imprimables. Donc par exemple si on a besoin d'un octet de valeur 0xff = 255, il n'y a pas de caractère associé qu'on peut écrire. Du coup, à la place on utilise une séquence d'échappement et on écrit "\xff". Ça marche, mais ça prend 4 octets dans le fichier .py pour représenter un octet de données, ce qui est bof.

Il se trouve que MicroPython est assez permissif et nous autorise à écrire un octet de valeur 255 directement dans le b'...'. Avec --py-compact, si un octet de données de valeur 255 apparaît fxconv génère un fichier qui contiendra cet octet directement au lieu de "\xff". Mais il n'y a toujours pas de caractère associé, donc si tu essaies d'afficher ce fichier dans un éditeur de texte ou dans un terminal tu obtiens des résultats plus ou moins bizarres (caractères invisibles, ignorés, points d'interrogation, etc).

TL;DR : Dans le code que tu as plus haut y'a plein de \x** qui sont inefficaces et --py-compact en supprime la majorité au prix d'utiliser des caractères non imprimables à la place.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 22/05/2024 21:01 | #


Merci Lephe pour toutes tes explications

j'ai fait des essais avec dimage() et dsubimage()
C'est très instructif (en fait je n'avais jamais "travaillé" avec les images ... )

Quand on charge des images avec des import ça prend de la place en mémoire et est-ce qu'il à un moyen de libérer la place occupée dès qu'on n'a plus besoin de traiter une image ?

Autre question vaut-il mieux charger des grosses images et afficher les parties que l'on à besoin avec des dsubimage() ou charger plusieurs petites images ?

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

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

Citer : Posté le 04/06/2024 09:27 | #


un peu rien à voir avec le sujet . je me suis amusé a afficher les caracteres ASCII disponibles dans PE avec dtext() et j'ai été surpris de découvrir en dessous de chr(32) d'autres symboles. c'est sans doute déjà dit quelque part mais ça permet de faire un rappel.

un peu de code à l'arrache...
from gint import *
dclear(C_WHITE)
x,y=0,0
for i in range(257):
    dtext(x,y,C_BLACK,chr(i))
    if x==120:
        x=0
        y+=8
    else:
        x+=8
dupdate()
getkey()

et voila ce que ça donne :

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

Cakeisalie5 En ligne Ancien administrateur Points: 1945 Défis: 11 Message

Citer : Posté le 04/06/2024 09:37 | #


Hm, je suis pas sûr de la table de caractères en jeu ici. C'est du custom PE/gint @Lephenixnoir ?
Respirateur d'air, BDFL de Cahute, des utilitaires de communication pour calculatrices CASIO.


Mon blogMes autres projets
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 04/06/2024 09:39 | #


oui c'est en PythonExtra (abrégé par PE dans mon ticket ...)
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 04/06/2024 10:25 | #


C'est un vieil arrangement de caractères dans la police par défaut de gint... plus ou au moins au hasard, j'ai mis au petit bonheur la chance pour m'en servir dans gintctl. La vraie "bonne" façon de faire est d'utiliser une police Unicode comme uf5x7. Je devrais peut-être virer cette partie d'ailleurs...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 04/06/2024 10:27 | #


Ptitjoz a écrit :
Quand on charge des images avec des import ça prend de la place en mémoire et est-ce qu'il à un moyen de libérer la place occupée dès qu'on n'a plus besoin de traiter une image ?

La variable d'image elle-même tu peux la del. Par contre le module importé c'est plus dur. Un jour je fournirai une fonction pour charger directement depuis un fichier d'assets et y'aura plus le coût du module en plus.

Ptitjoz a écrit :
Autre question vaut-il mieux charger des grosses images et afficher les parties que l'on à besoin avec des dsubimage() ou charger plusieurs petites images ?

Dans l'ensemble mieux vaut charger des "grosses" images. Sur mono gint force les images à faire un multiple de 32 pixels de large. Donc si t'as une image de 5x5 et une image de 32x5 elles prennent la même place. Donc vaut mieux profiter des multiples de 32.

À part ça y'a pas trop de différence.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 04/06/2024 18:07 | #


merci Lephe pour tes explications

je me suis un peu amusé mais à déplacer un objet (je n'ai pas pris le soin, pour l'instant de prendre une autre image pour les directions)

mini video ps je ne sais pas quel format prendre pour que la video soit reconnue sur le forum.

penses tu que on peut faire un "jeu" suffisamment jouable en python extra ?

pour info j'ai repris ton image de spritesheet.png et transformé le canal alpha en blanc et passé la commande fxconv que tu m'avais expliquée.

edit video suite réponse de Lephe

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

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 04/06/2024 18:28 | #


Pour la vidéo il suffit de mettre le lien direct : [video=320]https://i.imgur.com/S4AkMh8.mp4[/video]

On peut carrément faire un jeu jouable oui, puisqu'on peut déjà faire des petits trucs avec le Python intégré y'a aucun doute qu'on peut avec PythonExtra
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ptitjoz Hors ligne Membre Points: 259 Défis: 10 Message

Citer : Posté le 04/06/2024 18:41 | #


d'accord merci j'ai modifié le post précédent.
oui avec getkey et time ça ouvre des possibilités. après faut s'investir pour faire un truc sympa

concernant le del dont tu m'a parlé précédemment quelle est la syntaxe ? del(image) ?
Un peu poète, un peu geek, un peu rêveur, un peu écolo.
https://joz.alwaysdata.net/info/

Lephenixnoir Hors ligne Administrateur Points: 24432 Défis: 170 Message

Citer : Posté le 04/06/2024 19:00 | #


Oui ou juste del image c'est un statement à part entière.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

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