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

Table avec scroll, ou widget scrollable

38 views
Skip to first unread message

Damien B.

unread,
Sep 26, 2011, 8:59:05 AM9/26/11
to
Bonjour,

Première fois que je poste sur ce groupe. Je travaille depuis quelques
temps sur des scripts TCL/TK.
Je suis sur un environnement fermé, c'est-a-dire que je suis bloqué
sur la version 8.0 de TCL et que je ne peux pas vraiment installer
d'extensions.

J'ai besoin de créer un tableau, mais ce widget n'existe pas de base.
J'ai entendu parler de tkTable, mais comme dit plus haut, je ne peut
pas vraiment installer d'extension.
Mon idée première a été de créer un widget frame et de placer des
labels pour constituer un tableau a peu près correct visuellement. Mon
soucis concerne le scroll. En effet le tableau va être assez grand au
final et j'aimerais pouvoir scroller verticalement.
Le problème c'est que le widget frame n'est pas scrollable à ma
connaissance. J'ai essayé de bidouiller avec un widget text, en y
insérant des labels, mais le scroll ne se fait pas sur les widgets
esclaves mais sur le contenu texte.
Je suis en plein dedans là, mais je n'ai pas encore trouvé de pistes.

Donc ma question est la suivante :
quelqu'un connait-il un moyen de créer un tableau scrollable très
simple, ou un moyen de scroller un widget text sur ses esclaves et non
sur son texte, ou enfin, quel autre widget pourrais-je utiliser?

Je continue a réfléchir mais si quelqu'un a une piste, ça serait
vraiment super :)
Merci!

Vince

unread,
Sep 26, 2011, 9:06:39 AM9/26/11
to
"Damien B." a écrit :
Et pourquoi pas un canvas ? C'est scrollable et tu peux y mettre ce que tu veux
dedans.

Damien B.

unread,
Sep 26, 2011, 9:35:41 AM9/26/11
to
Effectivement. Au début, une partie de moi me disait "non, un canvas
c'est pour des zones de dessin, ça serait trop de la bidouille
d'utiliser ça". Mais finalement c'est vraiment intéressant comme
widget. Je viens de comprendre comment insérer un widget dans un
canvas, du coup je vais faire comme ça.
Merci pour le conseil!

Vince

unread,
Sep 26, 2011, 9:45:51 AM9/26/11
to
"Damien B." a écrit :
Oui j'ai eu le même sentiment au départ mais au final on peut faire quelque
chose de vraiment puissant.

Damien B.

unread,
Sep 26, 2011, 11:48:42 AM9/26/11
to
Je m'oppose à un autre problème. Il faut dire que j'ai un peu de mal a
comprendre comment fonctionne le scroll.
Je créé mon canvas, lié a la scrollbar, et je pack tout ça dans une
frame avec un 3eme widget. Au moment du pack, le canvas prend une
taille que je ne peux plus changer.
Par la suite, dans une boucle, je remplis mon Canvas avec divers
labels, en ajoutant un ligne par tour de boucle pour faire un joli
tableau. Sauf que quand j'arrive au moment ou la ligne que je rajoute
va au delà de la taille du canvas définie par le pack, la méthode
create affecte automatiquement une taille de 1 à mes labels (tout ça
concerne uniquement la hauteur).
J'ai essayé de changer manuellement la taille du canvas à chaque tour
de boucle pour agrandir la zone, ça n'a aucun effet. J'ai aussi essayé
de définir une scrollregion, ça créé effectivement une region scrollée
plus grande mais la valeur height du canvas ne change pas, alors les
derniers labels ont toujours leur taille de 1...
Je comprend l'idée : si on essaye de créer un item en dehors de la
zone du canvas, j'imagine que l'initialisation des items créés ne se
fait pas correctement. Mais je ne sais pas trop comment faire pour
passer outre cette valeur de hauteur du canvas qui semble bloquée.

Vincent Verdon

unread,
Sep 26, 2011, 3:55:22 PM9/26/11
to
Bonsoir,

Le 26/09/2011 14:59, Damien B. a écrit :
> Bonjour,
>

> Mon idée première a été de créer un widget frame et de placer des
> labels pour constituer un tableau a peu près correct visuellement. Mon
> soucis concerne le scroll. En effet le tableau va être assez grand au
> final et j'aimerais pouvoir scroller verticalement.
> Le problème c'est que le widget frame n'est pas scrollable à ma
> connaissance. J'ai essayé de bidouiller avec un widget text, en y
> insérant des labels, mais le scroll ne se fait pas sur les widgets
> esclaves mais sur le contenu texte.
Je ne comprends pas : il s'agit bien de pouvoir faire défiler les labels
dans un cadre constitué du widget texte ?

Amicalement, Vincent Verdon

Damien B.

unread,
Sep 27, 2011, 3:54:11 AM9/27/11
to
Oui effectivement, c'était l'idée. Finalement j'utilise un Canvas,
comme conseillé par Vince. Je suis pas loin du résultat voulu, il me
reste un problème sur la taille du widget comme je l'ai dit dans mon
précédent message. J'y travaille encore aujourd'hui, je pense que
certaines choses m'échappent encore.
Mais je vais y arriver :)

Vince

unread,
Sep 27, 2011, 4:07:42 AM9/27/11
to
"Damien B." a écrit :
Voici mon code (désolé mais je ne peux pas trop publier mon code, mon adresse
email est valide, je peux t'envoyer une snapshot de ce que ça donne si tu veux)

# Déclaration des canvas
set cans(Header) [canvas $interior.canheader -highlightthickness 0 -width 190
-height 50]
set cans(RegisterList) [canvas $interior.canreglist -highlightthickness 0 -width
$preferencesRegisterWidth -background black]
set cans(ValueList) [canvas $interior.canvallist -highlightthickness 0 -width
$preferencesValueWidth -background black]
set cans(Separator0) [canvas $interior.cansep0 -highlightthickness 0 -width 5]
set cans(Separator1) [canvas $interior.cansep1 -highlightthickness 0 -width 5]
set cans(Bits) [canvas $interior.canbits -highlightthickness 0 -height 50
-background black]
set cans(DrawArea) [canvas $interior.candraw -highlightthickness 0 -background
black]
set cans(ValueAlign) [canvas $interior.canalign -highlightthickness 0 -width 17
-height 17]

# Déclaration des scrollbar
set scroll(RegisterList) [scrollbar $interior.scrollreg -orient horizontal]
set scroll(ValueList) [scrollbar $interior.scrollval -orient horizontal]
set scroll(DrawX) [scrollbar $interior.scrollx -orient horizontal]
set scroll(DrawY) [scrollbar $interior.scrolly -orient vertical]

# Configuration des canvas pour le scroll (une scrollbar peut commander plus
d'un canvas)
$cans(DrawArea) configure -yscrollcommand [list $scroll(DrawY) set]
-yscrollincrement [expr $yfont15 + $yfont10]
$cans(DrawArea) configure -xscrollcommand [list $scroll(DrawX) set]
$cans(RegisterList) configure -yscrollcommand [list $scroll(DrawY) set]
-yscrollincrement [expr $yfont15 + $yfont10]
$cans(RegisterList) configure -xscrollcommand [list $scroll(RegisterList) set]
$cans(ValueList) configure -yscrollcommand [list $scroll(DrawY) set]
-yscrollincrement [expr $yfont15 + $yfont10]
$cans(ValueList) configure -xscrollcommand [list $scroll(ValueList) set]

# Configuration des scrollbars
$scroll(DrawX) configure -command [itcl::code $this scrollX $cans(DrawArea)
[list $cans(DrawArea) $cans(Bits)]]
$scroll(DrawY) configure -command [itcl::code $this scrollY $cans(DrawArea)
[list $cans(DrawArea) $cans(RegisterList) $cans(ValueList)]]
$scroll(RegisterList) configure -command [itcl::code $this scrollX
$cans(RegisterList) [list $cans(RegisterList)]]
$scroll(ValueList) configure -command [itcl::code $this scrollX $cans(ValueList)
[list $cans(ValueList)]]

# Le binding pour la molette de la souris (pour scroller quand on bouge la
molette)
bind $cans(DrawArea) <4> [list [itcl::code $this scrollY] $cans(DrawArea) [list
$cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll -1 units]
bind $cans(DrawArea) <5> [list [itcl::code $this scrollY] $cans(DrawArea) [list
$cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll 1 units]
bind $cans(RegisterList) <4> [list [itcl::code $this scrollY] $cans(DrawArea)
[list $cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll -1 units]
bind $cans(RegisterList) <5> [list [itcl::code $this scrollY] $cans(DrawArea)
[list $cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll 1 units]
bind $cans(ValueList) <4> [list [itcl::code $this scrollY] $cans(DrawArea) [list
$cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll -1 units]
bind $cans(ValueList) <5> [list [itcl::code $this scrollY] $cans(DrawArea) [list
$cans(DrawArea) $cans(RegisterList) $cans(ValueList)] scroll 1 units]

# Le placement en utilisant grid
grid columnconfigure $interior 6 -weight 1
grid rowconfigure $interior 1 -weight 1

grid $cans(Header) -sticky nwes -column 0 -row 0 -columnspan 4
grid $cans(RegisterList) -sticky nwes -column 0 -row 1
grid $scroll(RegisterList) -sticky we -column 0 -row 2
grid $cans(Separator0) -sticky ns -column 1 -row 1 -rowspan 2
grid $cans(ValueList) -sticky nwes -column 2 -row 1 -columnspan 3
grid $scroll(ValueList) -sticky we -column 2 -row 2 -columnspan 2
grid $cans(ValueAlign) -sticky e -column 4 -row 2
grid $cans(Separator1) -sticky ns -column 5 -row 0 -rowspan 3
grid $cans(Bits) -sticky nwes -column 6 -row 0
grid $cans(DrawArea) -sticky nwes -column 6 -row 1
grid $scroll(DrawX) -sticky we -column 6 -row 2
grid $scroll(DrawY) -sticky ns -column 7 -row 1

Damien B.

unread,
Sep 27, 2011, 5:29:18 AM9/27/11
to
J'avoue que je ne suis pas certain de comprendre ton code. Tu créé un
canvas pour chaque partie de ton tableau?
De mon côté j'ai essayé de créer un seul Canvas, d'insérer des labels
à l’intérieur avec la commande create, en les dimensionnant comme je
le souhaite, puis de les placer de manière à faire un tableau. Je suis
bloqué car la commande create dimensionne automatiquement les widgets
créés s'il ils dépassent de la taille du Canvas. Je ne sais pas trop
comment faire.

A côté, je suis reparti sur l'utilisation d'un text, qui contient
aussi une méthode window create. Le principe est de créer des labels
et de les ajouter, ligne par ligne. Ici, la taille du widget et son
scroll se mettent à jour automatiquement, c'est bien plus simple!
Par contre, si j'arrive à faire en sorte que chaque labels d'une ligne
ai la même hauteur grâce à l'option stretch, je n'arrive pas à fixer
une largeur pour chaque colonne, car l'option width des labels prend
un valeur en nombre de caractères pas pratique du tout dans mon cas.

En résumé, le positionnement et la gestion du scroll sont plus simple
avec un text, mais forcer la taille des labels n'est pas évident. Avec
un canvas, forcer la taille des labels est plus simple, le
positionnement est un peu plus laborieux mais possible, mais c'est la
mise a jour de la taille du canvas et du scrolling qui pose problème.
Je continue, je finirais bien pas trouver la bonne solution. Et merci
de votre aide!

Vincent Verdon

unread,
Sep 27, 2011, 8:34:50 AM9/27/11
to
Bonjour,

Le 27/09/2011 09:54, Damien B. a écrit :
> On 26 sep, 21:55, Vincent Verdon<vincent.ver...@laposte.net> wrote:
>> Bonsoir,
>>
>> Le 26/09/2011 14:59, Damien B. a écrit :
>>
>>> Bonjour,
>>
>> Je ne comprends pas : il s'agit bien de pouvoir faire défiler les labels
>> dans un cadre constitué du widget texte ?
>>
>> Amicalement, Vincent Verdon
>
> Oui effectivement, c'était l'idée. Finalement j'utilise un Canvas,
> comme conseillé par Vince. Je suis pas loin du résultat voulu, il me
> reste un problème sur la taille du widget comme je l'ai dit dans mon
> précédent message. J'y travaille encore aujourd'hui, je pense que
> certaines choses m'échappent encore.
> Mais je vais y arriver :)

Voici un exemple de tableau scrollable créé à partir d'un text (copier
cet exemple et l'essayer !) :

toplevel .vis
frame .vis.f
pack .vis.f -side right -fill both -expand 1
# Création d'un widget texte destiné à recevoir la grille
text .vis.f.t -yscrollcommand {.vis.f.sv set}
pack .vis.f.t -expand 1 -fill both -side left
scrollbar .vis.f.sv -orient vertical -command {.vis.f.t yview}
pack .vis.f.sv -fill y -side left

.vis.f.t configure -state normal
# Tableau de 100 lignes
for {set i 1} {$i <= 100} {incr i} {
# On crée une frame par ligne
frame .vis.f.t.$i -borderwidth 2 -relief sunken
.vis.f.t window create end -window .vis.f.t.$i -stretch 1 -align center
# on va à la ligne
.vis.f.t insert end \n
# on place des widgets dans cette frame
label .vis.f.t.$i.l -text "Label $i" -width 30
pack .vis.f.t.$i.l -side left
entry .vis.f.t.$i.e -textvariable don($i) -width 20
pack .vis.f.t.$i.e -side left

}
# on empèche d'écrire dans le widget texte
.vis.f.t configure -state disabled

oc_forums

unread,
Sep 28, 2011, 2:33:45 AM9/28/11
to
Dans l'installation Tcl/Tk d'ActiveState (demos/Tk), il y a un exemple appelé "A simple scrollable canvas" avec un tableau fait de rectangles, cela peut-être un bon début ?

Kroc

unread,
Sep 28, 2011, 7:30:35 AM9/28/11
to
Bonjour,

Moi j'utilise avec bonheur depuis plusieurs années la scrolledframe
d'Ulis : http://wfr.tcl.tk/403

C'est bien plus simple que de ré-inventer la roue à chaque fois avec
un canvas. ;]

--
David Zolli

Vincent Verdon

unread,
Sep 28, 2011, 2:11:21 PM9/28/11
to
Bonsoir David,

Le 28/09/2011 13:30, Kroc a �crit :
> Bonjour,
>
> Moi j'utilise avec bonheur depuis plusieurs ann�es la scrolledframe
> d'Ulis : http://wfr.tcl.tk/403
>
> C'est bien plus simple que de r�-inventer la roue � chaque fois avec
> un canvas. ;]

Je me souvenais d'une cr�ation dans le genre de la part de notre Ulis,
mais je n'ai pas pris le temps de faire une recherche !
J'avoue que pour ma part, j'ai toujours utilis�, avec bonheur �galement,
la solution avec des frames incorpor�es � un text !

Amicalement, vincent Verdon

Damien B.

unread,
Sep 29, 2011, 3:34:30 AM9/29/11
to
Merci pour tous vos conseils.
Finalement, je suis resté sur un widget text scrollable, contenant des
Labels pour les cases du tableaux. J'ai défini les tailles un peu en
dur, mais finalement ça donne bien. Et on m'a demandé de pas perdre
trop de temps sur l'interface donc j'ai du me presser.
Merci en tout cas, je reviendrais lire tout ça quand j'aurais le temps
d'améliorer ça.
0 new messages