使用[pack info]隐藏/显示带有菜单检查按钮的小部件

时间:2016-02-06 00:05:57

标签: tcl tk

我想从菜单检查按钮中保存要隐藏的帧的信息。我收到以下错误:

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

感谢您的时间。

达明

1 个答案:

答案 0 :(得分:3)

不,你没有以错误的方式使用pack info,而是pack本身。 pack $w需要一个参数列表,并且您正在呈现一个它不知道的单个参数。

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

pack $w {*}$winfo

给出了期望的结果。

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

BTW:状态按钮显示反转行为。您应该在开头将其设置为 true 并反转if条件。然后,如果设置,则显示标签。这是正确的,因为在变量值之后,该命令被称为,因此可以更改命令中的值。