2009-08-24 3 views
2

Je suis novice en programmation tcl/tk. Voici un petit extrait de code sur la zone de liste déroulante. Comment puis-je ajouter et supprimer dynamiquement des valeurs de la zone de liste déroulante?Comment puis-je remplir dynamiquement les valeurs de la zone de liste déroulante TK?

set ff [ frame f] 
set label [Label $ff.label -text "Name:" ] 

set name [ComboBox $ff.name \ 
       -editable yes \ 
       -textvariable name] 

set addButton [Button $ff.addButton -text "+" -width 1 -command {addNameToComboBox}] 

set removeButton [Button $ff.removeButton -text "-" -width 1 -command removeNameFromComboBox}]  

grid $ff.addButton -row 0 -column 2 -sticky w 
grid $ff.removeButton -row 0 -column 3 -sticky sw -padx 5 

proc addNameToComboBox {name} { 

} 

proc removeNameFromComboBox {name} { 

} 

Cheers!

+0

Il existe de nombreuses implémentations de ComboBox avec tk. Vous n'utilisez pas celui qui est intégré, mais ce n'est pas évident lequel vous utilisez. Pouvez-vous nous dire quelle implémentation de combobox vous utilisez? –

Répondre

4

Votre exemple de code contient quelques bogues (*), et vous ne savez pas exactement ce que vous voulez faire. Voulez-vous ajouter la valeur actuelle de la zone de liste déroulante à la liste déroulante ou la valeur que vous souhaitez ajouter provient d'un autre emplacement?

Voici une solution qui ajoute la valeur actuelle de la liste déroulante à la liste. Il utilise les versions intégrées de la combobox, de l'étiquette et des widgets de boutons. Quel que soit le widget combobox que vous utilisez probablement fonctionne de manière similaire, mais peut-être pas exactement. (*) Button, Label et ComboBox ne sont pas des widgets standard - vouliez-vous dire "button", "label" et "ttk :: combobox" ou utilisez-vous des widgets personnalisés ?. De plus, vous avez oublié d'utiliser la grille pour gérer la liste déroulante et l'étiquette, et vos procs attendent des arguments mais vous n'en transmettez aucun).

Cette solution fonctionne avec tcl/tk 8.5 et intégré TTK :: widget combobox:

package require Tk 8.5 

set ff [frame .f] 
set label [label $ff.label -text "Name:" ] 
set name [ttk::combobox $ff.name -textvariable name] 
set addButton [button $ff.addButton -text "+" -width 1 \ 
    -command [list addNameToComboBox $name]] 
set removeButton [button $ff.removeButton -text "-" -width 1 \ 
    -command [list removeNameFromComboBox $name]] 
grid $label $name 
grid $ff.addButton -row 0 -column 2 -sticky w 
grid $ff.removeButton -row 0 -column 3 -sticky sw -padx 5 
pack $ff -side top -fill both -expand true 

proc addNameToComboBox {name} { 
    set values [$name cget -values] 
    set current_value [$name get] 
    if {$current_value ni $values} { 
     lappend values $current_value 
     $name configure -values $values 
    } 
} 

proc removeNameFromComboBox {name} { 
    set values [$name cget -values] 
    set current_value [$name get] 
    if {$current_value in $values} { 
     set i [lsearch -exact $values $current_value] 
     set values [lreplace $values $i $i] 
     $name configure -values $values 
    }  
} 
Questions connexes