Скрыть / показать виджет с кнопкой меню, используя [информация о пакете]
Я хочу сохранить информацию о кадре, который я хочу скрыть, из кнопки меню. Я получаю следующую ошибку:
дополнительная опция "-in .mainframe -anchor center -expand 0 -fill x -ipadx 0 -ipady 0 -padx 0 -pady 0 -side top" (опция без значения?) при выполнении "pack $w $winfo" (процедура Строка "cmd_toggle" 9) вызывается из "cmd_toggle .mainframe.l1" (вызов меню)
Я неправильно использую информацию о пакете?
package require Tk
package require Ttk
# Menu
menu .menu
menu .menu.m1
.menu add cascade -menu .menu.m1 -label "menu1"
. config -menu .menu
# Frame + label
frame .mainframe
label .mainframe.l1 -text "blabla" -width 22
.menu.m1 add checkbutton -label "Toggle" -variable state -command [list cmd_toggle .mainframe.l1]
pack .mainframe.l1 -fill x
pack .mainframe -side left
set winfo "" ; # save of the widget pack info
proc cmd_toggle { w } {
global state
global winfo
if {$state} {
set winfo [pack info $w]
pack forget $w
} else {
pack $w $winfo
}
}
Спасибо за ваше время.
Damien
1 ответ
Нет, вы не используете pack info
неправильный путь, но pack
сам. pack $w
нужен список аргументов, и вы представляете один аргумент, который он не знает.
Решение ее заключается в том, чтобы сломать $winfo
в список аргументов с помощью {*}
оператор. Изменение строки на это
pack $w {*}$winfo
дает желаемый результат.
Ты можешь использовать winfo ismapped $w
чтобы избежать глобального state
переменная, если вы не используете кнопку-флажок (для этого нужна переменная).
Кстати: кнопка состояния показывает перевернутое поведение. Вы должны установить его в true в начале и инвертировать условие if. Затем, если он установлен, метка отображается. Это верно, потому что команда вызывается после изменения значения переменной, поэтому можно изменить значение в команде.