OVH Cloud OVH Cloud

Nombre variable d'objets dans un canevas...

3 réponses
Avatar
H.
Bonsoir...

Dans une des applis que j'essaye de développer à titre d'essai, je me
trouve avec un nombre variable d'objets circulaires identiques à tracer dans
un canevas. Ce nombre est fonction d'un certain nombre de paramètres, et est
stocké dans une variable entière. La position des cercles (centres) est
stockée dans une liste de listes :
[ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0, 0], [0, 0]..... ]

Je ne sais pas comment gérer cette partie de l'application. Si je
déclare un seul objet cercle, il n'y en aura au final qu'un seul tracé. Si
j'en déclare plusieurs, c'est très lourd (j'ai essayé cercle[i] dans une
boucle, mais ça ne marche pas).
Si quelqu'un a une idée...


Cordialement,
Christophe

3 réponses

Avatar
Eric Brunel
On Sun, 16 Jul 2006 22:02:41 +0200, H.
wrote:

Bonsoir...

Dans une des applis que j'essaye de développer à titre d'essai, je me
trouve avec un nombre variable d'objets circulaires identiques à tracer
dans
un canevas.


Donc dans une application graphique, n'est-ce pas? Quel est le toolkit
utilisé?

Ce nombre est fonction d'un certain nombre de paramètres, et est
stocké dans une variable entière. La position des cercles (centres) est
stockée dans une liste de listes :
[ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0, 0], [0, 0]..... ]

Je ne sais pas comment gérer cette partie de l'application. Si je
déclare un seul objet cercle, il n'y en aura au final qu'un seul tracé.


"Déclare"? Il n'y a pas de déclaration en Python. Pourrait-on voir un bout
de code (même qui ne marche pas)?

Si
j'en déclare plusieurs, c'est très lourd (j'ai essayé cercle[i] dans une
boucle, mais ça ne marche pas).


Pourquoi "ça ne marche pas"? Ca génère une erreur? Ca ne fait pas ce que
tu attends?

Si quelqu'un a une idée...


Oui, plein, oui. Mais sans plus de détails sur le contexte, ça va être dur
de t'aider efficacement... Voilà tout de même un petit bout de code qui
fait ce que je comprends que tu veux avecTkinter:

--------------------------------
from Tkinter import *

coordonneesCentres = [ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0, 0],
[0, 0] ]
demiRayonCercle = 2
fenetre = Tk()
canevas = Canvas(fenetre)
canevas.pack(fill=BOTH)
for xCentre, yCentre in coordonneesCentres:
canevas.create_oval(xCentre - demiRayonCercle, yCentre - demiRayonCercle,
xCentre + demiRayonCercle, yCentre + demiRayonCercle)
fenetre.mainloop()
--------------------------------

HTH quand même...
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
H.
Eric Brunel :
[...]

Pas de soucis, je suis effectivement avec Tkinter.


Je ne sais pas comment gérer cette partie de l'application. Si je
déclare un seul objet cercle, il n'y en aura au final qu'un seul tracé.


"Déclare"? Il n'y a pas de déclaration en Python. Pourrait-on voir un bout
de code (même qui ne marche pas)?


J'appelle "déclaration" la "création" de l'objet :
cercle1 = canevas1.create_oval(x1, y1, x1+40, y1+40, width=2,
fill="red")



J'ai l'habitude des langages où on doit déclarer les variables (Turbo
Pascal et autres) donc l'habitude reste... Ici, je considère qu'on a créé et
"déclaré" un objet cercle1.
Après, on peut "mettre à jour" cet objet :
# modifications de x1 et y1 #
canevas1.coords(cerlce1, x1, y1, x1+40, y1+40)





J'ai essayé cercle[i] dans une boucle, mais ça ne marche pas).
Pourquoi "ça ne marche pas" ?



Erreur de syntaxe. On ne peut pas associer un indice à un objet
graphique apparement... ou je ne m'y prends pas de la bonne manière...


--------------------------------
from Tkinter import *

coordonneesCentres = [ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0, 0],
[0, 0] ]
demiRayonCercle = 2
fenetre = Tk()
canevas = Canvas(fenetre)
canevas.pack(fill=BOTH)
for xCentre, yCentre in coordonneesCentres:
canevas.create_oval(xCentre - demiRayonCercle, yCentre -
demiRayonCercle,
xCentre + demiRayonCercle, yCentre +
demiRayonCercle)
fenetre.mainloop()
--------------------------------


Merci. Effectivement, ça fonctionne (enfin, ça devrait, parce que je
n'ai pas testé). Mais le problème, c'est que mes objets sont créés dans le
canevas, et affichés, mais ils ne sont pas associés à un *nom* qui
permettrait par après de les modifier.
J'ai besoin d'avoir n objets : cercle1, cercle2, cerle3.... cerclen que
je puisse modifier à l'aide de la commande canevas1.coords(cerclei,...).
D'où mon essai avec les indices.


Je pourrais poster un morceau de code, mais je ne l'ai pas sur cette
machine (enfin, ça peut se régler, mais c'est juste pour ça que je ne poste
pas tout de suite) et puis je ne crois pas que ça pourrait éclaircir le
problème, toutes les données sont là. Mais si vous pensez que... je peux le
mettre.


Cordialement,
Christophe

P.S. : pour pas aider, le schmilblick en question se trouve dans une
procédure récursive, elle-même dans une boucle mainloop()...



Avatar
Jonathan Barnoud
Eric Brunel :
[...]

Pas de soucis, je suis effectivement avec Tkinter.


Je ne sais pas comment gérer cette partie de l'application. Si je
déclare un seul objet cercle, il n'y en aura au final qu'un seul tracé.
"Déclare"? Il n'y a pas de déclaration en Python. Pourrait-on voir un bout

de code (même qui ne marche pas)?


J'appelle "déclaration" la "création" de l'objet :
cercle1 = canevas1.create_oval(x1, y1, x1+40, y1+40, width=2,
fill="red")



J'ai l'habitude des langages où on doit déclarer les variables (Turbo
Pascal et autres) donc l'habitude reste... Ici, je considère qu'on a créé et
"déclaré" un objet cercle1.
Après, on peut "mettre à jour" cet objet :
# modifications de x1 et y1 #
canevas1.coords(cerlce1, x1, y1, x1+40, y1+40)





J'ai essayé cercle[i] dans une boucle, mais ça ne marche pas).
Pourquoi "ça ne marche pas" ?



Erreur de syntaxe. On ne peut pas associer un indice à un objet
graphique apparement... ou je ne m'y prends pas de la bonne manière...


--------------------------------
from Tkinter import *

coordonneesCentres = [ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0, 0],
[0, 0] ]
demiRayonCercle = 2
fenetre = Tk()
canevas = Canvas(fenetre)
canevas.pack(fill=BOTH)
for xCentre, yCentre in coordonneesCentres:
canevas.create_oval(xCentre - demiRayonCercle, yCentre -
demiRayonCercle,
xCentre + demiRayonCercle, yCentre +
demiRayonCercle)
fenetre.mainloop()
--------------------------------


Merci. Effectivement, ça fonctionne (enfin, ça devrait, parce que je
n'ai pas testé). Mais le problème, c'est que mes objets sont créés dans le
canevas, et affichés, mais ils ne sont pas associés à un *nom* qui
permettrait par après de les modifier.
J'ai besoin d'avoir n objets : cercle1, cercle2, cerle3.... cerclen que
je puisse modifier à l'aide de la commande canevas1.coords(cerclei,...).
D'où mon essai avec les indices.


En créant une liste et en ajoutant les objet dans celle-ci ça ne marche
pas ? J'ai testé le code ci-dessous sans difficultées. On pourrait aussi
utiliser un dictionnaire.
--------------------------------
from Tkinter import *

cercles = []
coordonneesCentres = [ [1, 5], [4, 3], [17, 25], [48, 52], [0, 0], [0,
0], [0, 0] ]
demiRayonCercle = 2
fenetre = Tk()
canevas = Canvas(fenetre)
canevas.pack(fill=BOTH)
for xCentre, yCentre in coordonneesCentres:
cercles.append(canevas.create_oval(xCentre - demiRayonCercle,
yCentre- demiRayonCercle, xCentre + demiRayonCercle, yCentre +
demiRayonCercle))
fenetre.mainloop()
--------------------------------


Je pourrais poster un morceau de code, mais je ne l'ai pas sur cette
machine (enfin, ça peut se régler, mais c'est juste pour ça que je ne poste
pas tout de suite) et puis je ne crois pas que ça pourrait éclaircir le
problème, toutes les données sont là. Mais si vous pensez que... je peux le
mettre.


Cordialement,
Christophe


Jonathan Barnoud

P.S. : pour pas aider, le schmilblick en question se trouve dans une
procédure récursive, elle-même dans une boucle mainloop()...