Hide/show 使用 [包信息] 的带有菜单复选按钮的小部件

Hide/show a widget with a menu checkbutton using [pack info]

我想保存要从菜单复选按钮中隐藏的框架的信息。我收到以下错误:

extra option "-in .mainframe -anchor center -expand 0 -fill x -ipadx 0 -ipady 0 -padx 0 -pady 0 -side top" (option with no value?)
    while executing
"pack $w $winfo"
    (procedure "cmd_toggle" line 9)
    invoked from within
"cmd_toggle .mainframe.l1"
    (menu invoke)

我是不是用错了包信息?

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
   }
}

感谢您的宝贵时间。

达米恩

不,您没有使用错误的方式 pack info,而是 pack 本身。 pack $w 需要一个论点列表,而您提出了一个它不知道的论点。

她的解决方案是,在 {*} 运算符的帮助下将 $winfo 分解为参数列表。将行更改为此

pack $w {*}$winfo

给出了想要的结果。

如果您不使用 checkbutton(需要变量),您可以使用 winfo ismapped $w 来避免使用全局 state 变量。

顺便说一句:状态按钮显示出相反的行为。您应该在开始时将其设置为 true 并反转 if 条件。然后,如果已设置,则会显示标签。确实如此,因为在变量值改变后调用命令,所以可以改变命令中的值。