TCL/TK 使用复选按钮创建和销毁小部件

TCL/TK create and destroy widget with checkbutton

我想创建和销毁带有复选按钮的小部件。小部件将在选中复选按钮时创建,并在取消选中复选按钮时销毁。创建工作正常,但是当应该销毁小部件时,将显示错误消息 Error: window name "ser" already exists in parent

package require Tk

wm title . "Some Test"
grid[ttk::frame .c -padding "3 3 12 12"] -column 0 -row 0 -sticky nwes
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
grid [ttk::checkbutton .c.checkSer -command createWidget \ 
    -variable CB -onvalue 1 -offvalue 0] -column 1 -row 3 -sticky w
    
set CB 0

proc createWidget {} {
    if {[catch {info exists $::ser} fid]} {
        grid [ttk::entry .c.ser -width 12 -textvariable ser] -column 2 -row 2 -sticky we
        grid [ttk::label .c.serlbl -text "Ser"] -column 1 -row 2 -sticky w
    } else {
        destroy .c.ser .c.serlbl
    }
}

如何销毁小部件而不出现此错误?

问题是你的陈述info exists $::ser。这会尝试读取全局变量 ser,然后检查是否存在名称存储在该变量中的变量。

所以您可能打算使用 info exists ::ser(不带 $)。但这也不会像你想要的那样工作。 ttk::entry 小部件实际上不会创建其文本变量,直到用户在条目中键入内容,并且当小部件被销毁时该变量不会被删除。

您将需要一种不同的方法来确定是创建还是销毁小部件。例如:

if {![winfo exists .c.ser]} {
    # Create the widgets
} else {
    # Destroy the widgets
}