ID onglet pour fermeture, ttk::notbook
Bonjour la communauté Tcl/Tkeuse
Mon 1ier message ! J'aurais préféré que ce soit pour autre chose que demander de l'aide, enfin bon... Je vais faire simple je suis relativement bien perdu vis-à-vis de ce langage. Je n'arrête pas de lire et relire la documentation en ligne et rien n'y fait. Quand j'ai l'impression d'enfin comprendre comment fonctionne quoi que ce soit, dans l'heure qui suit le vent tourne complétement.
Je veux faire une interface utilisant le widget ttk::notebook. Ça marche plutot bien jusqu'au moment au je veux fermer un onglet.
Pour fermer un onglet, je dois d'abord reconnaitre le numéro de cet onglet (c'est la seule méthode que j'ai touvé). Je ne peux pas le donner directement puisqu'il va dépendre de l'utilisateur (c'est lui qui décidera lequel il fermera) donc je dois passer par cette méthode qui utilise cette commande qui commence à me souler
Code:
.wdgnbk identify tab $x $y
Pourquoi dans tous les cas que j'ai essayé, je ne reçois rien en retour de cette commande ! Est-ce que je donne les mauvaises entrées ?
...
Bref je reste ouvert à tout commentaire constructif
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| namespace eval instruMultiPanel {
# Masques disponibles et leur status d'affichage
variable masquedispo {Masque1 Masque2 Masque3 Masque4 Masque5 Masque6}
variable masquevisible {1 1 1 0 0 0}
variable x_crs 0 y_crs 0
# APPEL: Par sélection dans la liste des masques
# EFFET: Change de masque et affiche le nouveau à la place
proc changermasque {} {
#index de l'élément sélectionné dans la Listbox
set selec [.listemasques curselection]
#index de l'onglet actif du ttk::notebook
set ongletactif [string index [.nb select] end]
if {$selec != $ongletactif} {
if {[lindex $::instruMultiPanel::masquevisible $selec] == 0} {
set ongletnom [lindex $::instruMultiPanel::masquedispo $selec]
.nb add [frame .nb.f$selec] -text $ongletnom
set ::instruMultiPanel::masquevisible [lreplace $::instruMultiPanel::masquevisible $selec $selec 1]
}
.nb select .nb.f$selec
}
}
# APPEL: (relachement du) clic droit dans l'onglet
# EFFET: Acquisition de l'emplacement du clic pour y afficher un menu contextuel
proc popupFermerMasque {} {
puts "début de la procédure de fermeture"
# Acquisition de l'emplacement du clic droit
variable x_crs [winfo pointerx .]
variable y_crs [winfo pointery .]
# variable x_rt [winfo vrootx .]
# variable y_rt [winfo vrooty .]
puts "pos x= $x_crs, pos y= $y_crs"
# puts "pos xrt= $x_rt, pos yrt= $y_rt"
#puts "x_rt [winfo vrootx .] y_rt [winfo vrooty .]"
puts "x [winfo x .] y [winfo y .]"
puts "x [expr [winfo pointerx .]-[winfo x .]] y [expr [winfo pointery .]-[winfo y .]]"
variable xcoord
variable ycoord
set xcoord(crs) $x_crs
set ycoord(crs) $y_crs
set xcoord(deux) [winfo x .]
set ycoord(deux) [winfo x .]
set xcoord(trois) [expr [winfo pointerx .]-[winfo x .]]
set ycoord(trois) [expr [winfo pointery .]-[winfo y .]]
# affichage du menu contextuel
# tk_popup .mn_ongl_cls %X %Y
tk_popup .mn_ongl_cls $x_crs $y_crs
}
# APPEL: Clic gauche dans le menu contextuel
# EFFET: Acquisition de l'onglet sélectionné pour le fermer
proc fermerOnglet {} {
variable x_crs
variable y_crs
variable ongletID
# set ongletID [.nb identify tab %X %Y]
set ongletID [.nb identify tab $x_crs $y_crs]
puts "close, X=$x_crs Y=$y_crs"
puts "ongletID=$ongletID"
# .nb hide $ongletID
puts "onglet clos"
variable xcoord
variable ycoord
set onglID(crs) [.nb identify tab $xcoord(crs) $ycoord(crs)]
set onglID(deux) [.nb identify tab $xcoord(deux) $ycoord(deux)]
set onglID(trois) [.nb identify tab $xcoord(trois) $ycoord(trois)]
puts "x $xcoord(crs) y $ycoord(crs) -> onglID(crs)=$onglID(crs)"
puts "x $xcoord(deux) y $ycoord(deux) -> onglID(deux)=$onglID(deux)"
puts "x $xcoord(trois) y $ycoord(trois) -> onglID(trois)=$onglID(trois)"
# --- À FAIRE ---
# masquevisible à actualiser (le 1 de l'onglet à RAZ)!
# Widgets du masque aussi à enlever
# mais ATTENTION: set tab [.nb identify tab x y] -> .nb hide $tab
}
# APPEL: À partir du programme principal
# EFFET: Mise en place et affichage widgets principals (liste de masques et notebook)
proc createdialog {} {
# ---------------
# --- Widgets ---
# ---------------
# ---> choix du masque
grid [ttk::labelframe .f00 -text Maskenliste -padding 3] -row 0 -column 0 -padx 3 -pady 3 -sticky ns
listbox .listemasques -height 10 -width 15 -listvariable instruMultiPanel::masquedispo -yscrollcommand {.scrllist set} \
-selectmode single
ttk::scrollbar .scrllist -orient vertical -command ".listemasques yview"
pack .listemasques .scrllist -in .f00 -side left -anchor n -fill y
# Colorize alternating lines of the listbox
for {set i 0} {$i<[llength $instruMultiPanel::masquedispo]} {incr i 2} {
.listemasques itemconfigure $i -background #f0f0ff
}
# ---> Gestionnaire d'onglets (notebook)
grid [ttk::notebook .nb] -row 0 -column 1 -sticky n
for {set i 0} {$i<3} {incr i} {
.nb add [frame .nb.f$i] -text "[lindex $instruMultiPanel::masquedispo $i]"
}
.nb select .nb.f1
ttk::notebook::enableTraversal .nb
# Référence des widgets par leur affichage dans l'onglet prévu
variable ind_ongl_masque0 .nb.f0
variable ind_ongl_masque1 .nb.f1
# ---> menu contextuel de fermeture d'onglet
menu .mn_ongl_cls -tearoff 0
.mn_ongl_cls add command -label "Fermer l'onglet" -command instruMultiPanel::fermerOnglet
# ----------------
# --- Bindings ---
# ----------------
# ---> Changement de masque (resp. affichage)
bind .listemasques <ButtonRelease-1> instruMultiPanel::changermasque
# ---> Fermeture d'onglet
bind .nb <ButtonRelease-3> instruMultiPanel::popupFermerMasque
# ------------------------------------
# --- Affichage des autres onglets ---
# ------------------------------------
#createdialogSteuerung ind_ongl_masque0
#createdialogACC ind_ongl_masque1
}
# Charger les scripts des différents masques disponibles
#source C:/work_yw/tcl_labo/multipanel/maskSteuerung.tcl
#source C:/work_yw/tcl_labo/multipanel/maskACC.tcl
}
# -------------------
# Programme Principal
# -------------------
::instruMultiPanel::createdialog |