Как передать значение меню в подменю

#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 s invoke d, чтобы они -command могли сделать что-нибудь полезное… но они этого не делают. В -postcommand подменю будет работать … но тогда у вас уже есть отдельные меню, и вы также можете использовать прямое связывание.