2017-10-18 11 views
0
global SelectMode 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {puts [.lb curselection]} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

quand je sélectionne l'élément (choisissez « Func2 » comme exemple) dans la liste, puis sélectionnez le mode dans la liste déroulante, puis-je obtenir une sortie de chaîne vide inattendu comme ci-dessous:comment conserver l'état sélectionné de l'élément de liste?

1 
"" (unneeded) 

comment conserver l'état sélectionné de l'élément de liste déroulante et non affecté par la liste déroulante? Merci

+0

FWIW, je ne peux pas reproduire ce problème. Vraisemblablement quelque chose d'autre pas dans ce code provoque la chaîne vide supplémentaire. –

+0

@Peter Lewerin ehm ... J'ai essayé à nouveau sous Linux, la chaîne extra vide n'apparaîtra pas. C'est bien, et avez-vous une idée de continuer à afficher l'état de l'élément de la liste de sélection, pas besoin de chaîne de sortie? – Jimmy

+0

Eh bien, techniquement, l'état de sélection * est * déjà affiché dans le widget listbox, mais que diriez-vous d'utiliser la même liaison que maintenant, mais de définir le texte d'un widget étiquette au lieu de sortir la sélection? –

Répondre

0

La commande .lb curselection utilise le focus du gestionnaire de fenêtres pour savoir ce qui est sélectionné. Comme le gestionnaire de fenêtres est occupé avec un autre élément (la liste déroulante dans ce cas), il ne peut pas voir que la liste a une sélection. La solution consiste à écrire une procédure pour suivre la sélection de la liste. Et mettre à jour une variable lorsque la sélection est modifiée.

global SelectMode 
lb_selection = "" 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {ListSelectionChanged %W} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

# Procedure bound to <<ListboxSelect>> virtual event. 
proc ListSelectionChanged { listbox } { 
    global lb_selection 
    set lb_selection [$listbox curselection] 
} 

# Procedure to repeatedly print the selection status of the listbox 
proc printLBSelection { } { 
    global lb_selection 
    puts $lb_selection 
    after 2000 printLBSelection 
} 
+0

Merci pour votre explication, mais je ne veux pas imprimer à plusieurs reprises l'état de la sélection, je veux juste continuer à afficher que la liste a une sélection. Suivez votre conseil, j'ajoute le "$ listbox selection set $ lb_selection" dans printLBSelection, il semble fonctionner, mais s'il y a une autre solution de contournement sans utiliser "after 2000 printLBSelection"? Merci. – Jimmy

+0

@Peter Lewerin commentaire ci-dessus peut être ce que vous cherchez globalement. Cela fonctionnerait un peu comme un combobox en ce que l'étiquette pourrait stocker la sélection actuelle de la liste. Au lieu d'une variable globale, utilisez un StringVar comme variable texte de l'étiquette, et chaque fois que la valeur de la zone de liste change, appelez la méthode .set() sur la variable de l'étiquette pour mettre à jour la sélection. Ensuite, vous n'avez pas besoin d'imprimer quoi que ce soit - la réponse sera plus visible sur l'interface utilisateur. –

0

Vous pouvez définir l'option exportselection à false pour empêcher la sélection de changer quand un autre widget a une sélection.

listbox .lb -listvariable FunList -exportselection false 
+0

Merci! C'est vraiment ce que je veux! – Jimmy