IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tcl/Tk Discussion :

ID onglet pour fermeture, ttk::notbook


Sujet :

Tcl/Tk

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Points : 50
    Points
    50
    Par défaut 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 tcl/tk : Sélectionner tout - Visualiser dans une fenêtre à part
    .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 tcl/tk : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu n'utilises pas le binding comme il faut. Il faut faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Création d'un widget pour les tests :
    pack [ttk::notebook .nb]
    for {set i 0} {$i<3} {incr i} {
        .nb add [frame .nb.f$i] -text "Onglet $i"
    }
     
    # Procédure qui va recevoir le binding :
    proc test {x y} {
        puts "$x $y '[.nb identify tab $x $y]'"
    }
     
    # Binding :
    bind .nb <Button-2> {test %x %y}
    J'ai utilisé le bouton 2 parce que je n'ai pas de bouton 3 sur le Mac, mais ça marche pareil.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Points : 50
    Points
    50
    Par défaut
    La vache ! Ça marche en effet. Bon ben j'ai plus qu'à décortiquer ce que je faisais maladroitement.
    Merci beaucoup krok !
    _____________________________________________________

    Bon ben après test et adaptation, mon bout de code donne ça pour ceux à qui ça pourrait servir (au cas ou...)

    Code tcl/tk : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    namespace eval instruMultiPanel {
     
    	# Masques disponibles et leur status d'affichage
        variable masquedispo {Masque1 Masque2 Masque3 Masque4 Masque5 Masque6}
        variable masquevisible {0 1 2 -1 -1 -1}
        variable tabid
     
        # 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] == -1} {
    				set ongletnom [lindex $::instruMultiPanel::masquedispo $selec]
    				.nb add [frame .nb.f$selec] -text $ongletnom
    				set ::instruMultiPanel::masquevisible [lreplace $::instruMultiPanel::masquevisible $selec $selec $selec]
    			}
    			.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 {argx argy argX argY} {
    		# emplacement du clic droit
    		variable tabid [.nb identify tab $argx $argy]
     
    		# affichage du menu au même emplacement
    		tk_popup .mn_ongl_cls $argX $argY
    	}
     
    	# APPEL: Clic gauche dans le menu contextuel
    	# EFFET: Fermeture de l'onglet sélectionné
    	proc fermerOnglet {} {
    		variable tabid
    		.nb hide $tabid
    	}
     
    	# 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 %x %y %X %Y"
     
    		# ------------------------------------
    		# --- 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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-00031 : session déjà marquée pour fermeture
    Par macben dans le forum Oracle
    Réponses: 8
    Dernier message: 27/02/2018, 15h16
  2. Onglet pour Formulaire sortie et entrée
    Par arabi dans le forum 4D
    Réponses: 1
    Dernier message: 20/12/2006, 16h27
  3. [C#.NET] Mettre le focus sur un onglet (pour le faire afficher)
    Par TheParadoX dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/09/2006, 18h10
  4. Champ heure pour fermeture
    Par Renardo dans le forum Access
    Réponses: 8
    Dernier message: 21/08/2006, 10h35
  5. Réponses: 1
    Dernier message: 05/05/2006, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo