#tcl #tk
#tcl #tk
Вопрос:
menubutton .mb -text Example -menu .mb.menu
pack .mb -padx 10 -pady 10
set m [menu .mb.menu -tearoff 1]
$m add cascade -label A -menu $m.sub1
$m add cascade -label B -menu $m.sub1
$m add cascade -label C -menu $m.sub1
set m2 [menu $m.sub1 -tearoff 0]
$m2 add radio -label x -variable fruit -value apple
$m2 add radio -label y -variable fruit -value orange
$m2 add radio -label z -variable fruit -value kiwi
Допустим, кто-то нажимает на B, затем на z, я хочу напечатать Bz.
Допустим, кто-то нажимает на A, затем на y, я хочу напечатать Ay.
Как это сделать?т. е. он должен передавать значения меню в значения подменю
Ответ №1:
Когда вы используете одно меню в нескольких подобных каскадных записях, вы не можете отличить их друг от друга. Чтобы отличить их, вы должны создать подменю три раза и либо связать обратные вызовы (как показано ниже), либо присвоить каждому из них свой собственный -postcommand
.
menubutton .mb -text Example -menu .mb.menu
pack .mb -padx 10 -pady 10
set m [menu .mb.menu -tearoff 1]
foreach cmd {sub1 sub2 sub3} tag {A B C} {
set m2 [menu $m.$cmd -tearoff 0]
foreach label {x y z} value {apple orange kiwi} {
$m2 add radio -label $label -variable fruit -value $value
-command [list puts $tag$label]
}
# I prefer to add the cascades after making the submenu
$m add cascade -label $tag -menu $m2
}
Комментарии:
1. Я исследовал, получают ли
cascade
sinvoke
d, чтобы они-command
могли сделать что-нибудь полезное… но они этого не делают. В-postcommand
подменю будет работать … но тогда у вас уже есть отдельные меню, и вы также можете использовать прямое связывание.