Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Faire des graphiques en python comme sur AppleII

7 réponses
Avatar
Laurent Claessens
Bonjour

Je cherche à faire des graphiques tout bêtes en python. Je voudrais
donc faire un programme qui génère une fenêtre noire, et pouvoir y
dessiner des lignes et des points en donnant leurs coordonnées.

Lorsque j'étais jeune, je faisais du BASIC sur AppleII, et c'était
facile. Ensuite je suis passé au Pascal3 puis 6 et ça commençait à être
de plus en plus difficile.
Et maintenant en python j'ai l'impression que je vais devoir écrire 100
lignes de code pour définir une fenêtre et le mode graphique qui sera
utilisé dedans, me trompe-je ?

Mes objectifs sont de deux ordres.

1. Pédagogique. Je voudrais initier des enfants à la programmation, et
je trouve très marrant de tracer des graphiques simples avec des points
et des droites.

2. Je voudrais faire l'animation de la courbe
f(x,t)=sin(sqrt(x)t)

Quand j'étais jeune, en Pascal3, j'aurais fait ça en 2 minutes : je
trace pour t=0, j'efface, je trace pour t=0.1, j'efface, je trace
j'efface, etc.
C'était peut-être un peu moche, mais ça fonctionnait et on voyait le
truc qui bougeait :)

Y'aurais moyen de faire ce genre de choses avec matplolib ? Le truc
est que je ne veux pas générer UN graphique, mais plusieurs et que ça
donne une impression d'animation. J'ai l'impression que matplotlib ne me
permet "que" de créer des fichiers png ou autres, statiques.

J'ai aussi essayé de mettre du time.sleep entre le tracé de éléments
dans tkinter, mais ça trace quand même tout d'un coup.

Des idées ?

Bonne après-midi
Laurent

7 réponses

Avatar
pdorange
Laurent Claessens wrote:

Je cherche à faire des graphiques tout bêtes en python. Je voudrais
donc faire un programme qui génère une fenêtre noire, et pouvoir y
dessiner des lignes et des points en donnant leurs coordonnées.

Lorsque j'étais jeune, je faisais du BASIC sur AppleII, et c'était
facile. Ensuite je suis passé au Pascal3 puis 6 et ça commençait à être
de plus en plus difficile.
Et maintenant en python j'ai l'impression que je vais devoir écrire 100
lignes de code pour définir une fenêtre et le mode graphique qui sera
utilisé dedans, me trompe-je ?



Pas totalement mais il y a des solutions assez simple avec python.
Toutefois en plus de python il te faut une librairie graphique.


Mes objectifs sont de deux ordres.

1. Pédagogique. Je voudrais initier des enfants à la programmation, et
je trouve très marrant de tracer des graphiques simples avec des points
et des droites.

2. Je voudrais faire l'animation de la courbe
f(x,t)=sin(sqrt(x)t)

Quand j'étais jeune, en Pascal3, j'aurais fait ça en 2 minutes : je
trace pour t=0, j'efface, je trace pour t=0.1, j'efface, je trace
j'efface, etc.
C'était peut-être un peu moche, mais ça fonctionnait et on voyait le
truc qui bougeait :)

Y'aurais moyen de faire ce genre de choses avec matplolib ? Le truc
est que je ne veux pas générer UN graphique, mais plusieurs et que ça
donne une impression d'animation. J'ai l'impression que matplotlib ne me
permet "que" de créer des fichiers png ou autres, statiques.

J'ai aussi essayé de mettre du time.sleep entre le tracé de éléments
dans tkinter, mais ça trace quand même tout d'un coup.



Je ne connais pas matplolib mais si il génère des image PNG tu peux
ensuite (et pendant qu'il calcul la suivant) afficher la première (avec
un librairie graphique). C'est exactement le principe de l'animation sur
ordinateur. On prépare une "vue" en mémoire et ensuite on l'affiche d'un
seul coup et on recommence pour la suivante. Ca évite des clignotements
de mauvais effet que l'on peux avoir en dessiner directement a l'écran
puis effacer.

Je ne connais pas suffisamment pour t'en conseiller une simple a mettre
en ½uvre, perso j'utilise pygame (mais c'est une lib pour faire des jeux
et donc pas forcément le plus adapté).


--
Pierre-Alain Dorange <http://microwar.sourceforge.net/>

Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>
Avatar
Laurent Claessens
Et maintenant en python j'ai l'impression que je vais devoir écrire 100
lignes de code pour définir une fenêtre et le mode graphique qui sera
utilisé dedans, me trompe-je ?



Pas totalement mais il y a des solutions assez simple avec python.
Toutefois en plus de python il te faut une librairie graphique.



mmmm... C'est ce que je craignais ... J'espère que quelqu'un d'autre va
dire qu'on se trompe :)

Je ne connais pas matplolib mais si il génère des image PNG tu peux
ensuite (et pendant qu'il calcul la suivant) afficher la première (avec
un librairie graphique). C'est exactement le principe de l'animation sur
ordinateur. On prépare une "vue" en mémoire et ensuite on l'affiche d'un
seul coup et on recommence pour la suivante. Ca évite des clignotements
de mauvais effet que l'on peux avoir en dessiner directement a l'écran
puis effacer.




Moi en Pascal6, j'avais deux pages graphiques et j'évitais les
clignotement comme ça : on trace sur l'une pendant qu'on affiche l'autre.
Cependant, je vais quand même avouer que faire du python sur Ubuntu avec
2Go de RAM, c'est plus agréable que du Pascal sur un 286 et DOS 5. Je ne
vais pas pousser la nostalgie à ce point :d

Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>



:):) Je te cède gracieusement les droits sous la même licence sur ma
partie du texte que tu as citée :):)
Avatar
pdorange
Laurent Claessens wrote:

[...]
Moi en Pascal6, j'avais deux pages graphiques et j'évitais les
clignotement comme ça



C'est le principe du buffer ou mémoire cache. Que ce soit une zone
mémoire principale ou mémoire graphique (ce dont tu parles je suppose)
ou même un fichier image (plus lent) le principe est le même.
On prépare l'image hors écran et on l'affiche d'un seul bloc.

C'est automatiquement géré par pygame par exemple (bien qu pygame soit
pas forcément ce que tu cherches) :

tu crées un objet screen à partir de l'écran qui sera ton "cache".
screen = pygame.display.set_mode(size)

début de boucle :

Tu effaces ce screen
screen.fill(black)

Tu dessines dans ce screen
pygame.draw.line(screen, color, start_pos, end_pos, width=1)
ou mieux
pygame.draw.aaline (ligne anti aliasée)

Une fois finis, tu affiche ce screen
pygame.display.flip()

et tu boucles...

Voir la base :
http://pygame.org/docs/tut/intro/intro.html

: on trace sur l'une pendant qu'on affiche l'autre.
Cependant, je vais quand même avouer que faire du python sur Ubuntu avec
2Go de RAM, c'est plus agréable que du Pascal sur un 286 et DOS 5. Je ne
vais pas pousser la nostalgie à ce point :d

> Ce message est sous licence Creative Commons "by-nc-sa-2.0"
> <http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>

:):) Je te cède gracieusement les droits sous la même licence sur ma
partie du texte que tu as citée :):)



Tu es obligé a partir du moment ou tu cites (sa) ;-)

--
Pierre-Alain Dorange <http://microwar.sourceforge.net/>

Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>
Avatar
Jean-Pierre Vidal
Bonjour

Je cherche à faire des graphiques tout bêtes en python. Je voudrais
donc faire un programme qui génère une fenêtre noire, et pouvoir y
dessiner des lignes et des points en donnant leurs coordonnées.

Lorsque j'étais jeune, je faisais du BASIC sur AppleII, et c'était
facile. Ensuite je suis passé au Pascal3 puis 6 et ça commençait à être
de plus en plus difficile.
Et maintenant en python j'ai l'impression que je vais devoir écrire 100
lignes de code pour définir une fenêtre et le mode graphique qui sera
utilisé dedans, me trompe-je ?

Mes objectifs sont de deux ordres.

1. Pédagogique. Je voudrais initier des enfants à la programmation, et
je trouve très marrant de tracer des graphiques simples avec des points
et des droites.

2. Je voudrais faire l'animation de la courbe
f(x,t)=sin(sqrt(x)t)

Quand j'étais jeune, en Pascal3, j'aurais fait ça en 2 minutes : je
trace pour t=0, j'efface, je trace pour t=0.1, j'efface, je trace
j'efface, etc.
C'était peut-être un peu moche, mais ça fonctionnait et on voyait le
truc qui bougeait :)

Y'aurais moyen de faire ce genre de choses avec matplolib ? Le truc
est que je ne veux pas générer UN graphique, mais plusieurs et que ça
donne une impression d'animation. J'ai l'impression que matplotlib ne me
permet "que" de créer des fichiers png ou autres, statiques.

J'ai aussi essayé de mettre du time.sleep entre le tracé de éléments
dans tkinter, mais ça trace quand même tout d'un coup.

Des idées ?

Bonne après-midi
Laurent



Bonjour Laurent,

Pourquoi faire compliqué ?
Dans python-notes-2.pdf, l'excellent tutoriel de Gérard Swinnen
disponible à www.framasoft.net/IMG/pdf/python_notes-2.pdf, on trouve un
exemple (18.8.3 page 302) d'une balle animée d'un mouvement circulaire
dans sa fenêtre.
La balle est créée une fois pour toutes sur le "canevas" (méthode
create_oval) puis elle est déplacée en modifiant ses propriétés x et y
(méthode coords), en fonction du temps (sleep())
Cet exemple ne fait appel qu'à tkinter (ou Tkinter si Python < 3.x) qui
est en principe fourni dans le package.
Il me semble que cet exemple (36 lignes de code) est facile à adapter :
- en créant un objet "point" soit avec un create_oval(x-1, y-1, x+1, y
+1), soit avec un create_line(x, y, x+1, y+1)
- et en le déplaçant au cours du temps, en fonction de n'importe quelle
équation générant des coordonnées (x, y)

HTH

Jean-Pierre
Avatar
Laurent Claessens

Bonjour Laurent,

Pourquoi faire compliqué ?



Par snobisme :)

Dans python-notes-2.pdf, l'excellent tutoriel de Gérard Swinnen
disponible à www.framasoft.net/IMG/pdf/python_notes-2.pdf, on trouve un
exemple (18.8.3 page 302) d'une balle animée d'un mouvement circulaire
dans sa fenêtre.




Ah oui, ça a l'air d'être le genre de trucs que je cherche.
Argh, et en plus j'avais déjà ce manuel dans mes signets !

merci
Bonne aprème
Laurent
Avatar
kaeshi wasa
On 31-10-2011, Laurent Claessens wrote:
Bonjour

Je cherche à faire des graphiques tout bêtes en python. Je voudrais
donc faire un programme qui génère une fenêtre noire, et pouvoir y
dessiner des lignes et des points en donnant leurs coordonnées.



En plus de pygame il y a également le module turtle en standard.

--
kw
Avatar
LL.Snark
Bonsoir,

En parcourant rapidement le fil, il me semble que personne n'a cité le
module "graphics" de J. Zelle.
Il est basé sur tk, donc rien besoin de plus que le module et il s'agit
d'un simple fichier .py
Il est pas trop compliqué, et a pour intérêt de ne pas perdre de temps
avec tk si on veut juste faire un dessin.
Ce fichier est dispo ici :
http://mcsp.wartburg.edu/zelle/python/graphics.py
La version est pour Python 3.
Il doit y avoir une pour python2 aussi.

Une fois ce module dispo, on peut écrire par exemple :

<code>
import graphics as gr
import math
win = gr.GraphWin("Courbe", 400, 400,autoflushúlse)
c=gr.color_rgb(0,0,30)
for ang in range(0,1000,5) :
win.delete('all')
phi=ang/180*math.pi
for x in range(400) :
y=math.sin(x/20+phi)*(ang%150)+200
win.plotPixel(x,y,c)
gr.update()
win.close()
</code>

(Ce prog fonctionne avec Python 3...)

Il est aussi possible de donner un nouveau syst de coordonnées à la
fenêtre avec la méthode setCoord, ce qui peut être pratique pour tracer
des courbes.

Bonne soirée.