Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Canvas et coordonnées

17 views
Skip to first unread message

Vincent Verdon

unread,
Feb 22, 2012, 10:54:19 AM2/22/12
to
Bonjour,

un domaine que j'ai toujours mal maîtrisé... Les canvas scrollables...

Je fais :
---------------
set ::c .f.c
canvas $::c -background $::coul(fond) -cursor hand2 -scrollregion {-11c
-11c 50c 20c} \
-xscrollcommand ".hscroll set" \
-yscrollcommand ".f.vscroll set"
pack $::c -expand 1 -fill both -side left

# Scroll barres
scrollbar .f.vscroll -command "$::c yview"
scrollbar .hscroll -orient horiz -command "$::c xview"
pack .f.vscroll -side left -fill y
pack .hscroll -fill x

# Binding canvas
bind $::c <ButtonPress-1> {clic_gauche_canvas %x %y}
bind $::c <B1-Motion> {clic_gauche_canvas_bouge %x %y}
bind $::c <ButtonPress-3> {clic_droit_canvas %x %y}
---------------

Mes proc clic_gauche et suivantes récupèrent les bonnes coordonnées tant
que je ne n'agis pas sur les scrollbarres.
Mais après, il y a translation dans les coordonnées. Je n'ai pas trouvé
dans la doc comment résoudre ce problème. Cela fait que je n'arrive pas
à agir sur les objets placés sur le canvas, sauf à cliquer en dessous ou
à côté :-(

D'autre part, je ne comprends pas le principe de l'option scrollregion
(j'ai pompé le code quelque part...).

Amicalement, Vincent Verdon

winstin

unread,
Feb 23, 2012, 3:09:17 AM2/23/12
to
Pour ce déplacer sur le canvas tu peux utiliser les commandes
suivantes :
# Bind du mouvement de carte avec la souris :
bind $c <Button-1> {
$c scan mark %x %y
}
bind $c <B1-Motion> {
$c scan dragto %x %y 1
}

De plus, pour agir sur les objet, Il faut mieux mettre les bind sur
les objets de ton canvas par la commande ".c bind". Le canvas
s'utilise essentiellement avec les tags et les coordonnées ne te
serviront que pour le tracé.

Pour la scrollregion, il s'agit simplement de créer un canvas plus
grand que la zone affichée, par exemple la commande suivante crée un
canvas 4 fois (2x2) plus grand que la zone affichée :
canvas $::c -cursor hand2 -width 100 -height 100 -scrollregion {0 0
200 200} \
-xscrollcommand ".hscroll set" \
-yscrollcommand ".f.vscroll set"

N'hésite pas si tu veux des précisions...
Amicalement,
Lionel Wintersheim

Vincent Verdon

unread,
Feb 23, 2012, 12:58:18 PM2/23/12
to
Bonjour,

Le 23/02/2012 09:09, winstin a écrit :

> De plus, pour agir sur les objet, Il faut mieux mettre les bind sur
> les objets de ton canvas par la commande ".c bind". Le canvas
> s'utilise essentiellement avec les tags et les coordonnées ne te
> serviront que pour le tracé.

Je ne suis pas parti sur l'option bind sur les objets (que je
connais)... je ne sais plus bien pourquoi (choix fait il y a déjà un
an...) mais il y avait une bonne raison...
Les coordonnées me servent aussi à replacer les objets à la bonne
position lors de la réouverture du projet (il s'agit du dessin d'un
réseau dans un projet de simulateur. C'est là :
http://network-in.vverdon.fr).

Le problème des coordonnées c'est qu'elles sont calculées par rapport au
coin haut/gauche du cadre du widget canvas sur la toplevel, pas par
rapport à la taille réelle du canvas. Je trouve cela curieux.

>
> Pour la scrollregion, il s'agit simplement de créer un canvas plus
> grand que la zone affichée, par exemple la commande suivante crée un
> canvas 4 fois (2x2) plus grand que la zone affichée :
> canvas $::c -cursor hand2 -width 100 -height 100 -scrollregion {0 0
> 200 200} \
> -xscrollcommand ".hscroll set" \
> -yscrollcommand ".f.vscroll set"

Merci pour cette info bien utile !

Amicalement, Vincent Verdon
0 new messages