Скрыть / показать виджет с кнопкой меню, используя [информация о пакете]

Я хочу сохранить информацию о кадре, который я хочу скрыть, из кнопки меню. Я получаю следующую ошибку:

дополнительная опция "-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. Затем, если он установлен, метка отображается. Это верно, потому что команда вызывается после изменения значения переменной, поэтому можно изменить значение в команде.

Другие вопросы по тегам