从textvariable(条目小部件)获取价值

时间:2017-08-10 19:33:02

标签: tcl tk

我正在尝试创建一个简单的表单框,最终将数据放在数据库中。现在我只是用puts语句测试它,如下所示:

package require Tk

wm title . "Add"
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::label .c.idlbl -width 7 -text "id"] -column 1 -row 1 -sticky we
grid [ttk::entry .c.id -width 7 -textvariable id] -column 2 -row 1 -sticky we

grid [ttk::label .c.txtlbl -text "text"] -column 1 -row 2 -sticky w
grid [ttk::entry .c.txt -width 7 -textvariable text] -column 2 -row 2 -sticky we


grid [ttk::button .c.calc -text "Add!" -command db_add] -column 1 -row 3 -sticky w

foreach w [winfo children .c] {grid configure $w -padx 5 -pady 5}
focus .c.id


proc db_add {} {
    set id $::id
    set text $::text
    puts $id
    puts $text
}

我的问题:为什么在我可以对值进行任何操作之前,我需要将set转换为另一个变量名称?为什么我不能只做puts $::id

我尝试了puts expr{$::id},它提供了类似expr{Whatever Text Was Entered}的输出,让我不确定为什么expr不会消失。看来我在TCL中的变量概念目前非常模糊。

1 个答案:

答案 0 :(得分:0)

可以使用puts $::id,但在您输入文本到输入字段之前,变量不存在。您可以在创建窗口小部件的同时初始化它们,或者测试它们是否存在:

if {![info exists ::id]} {
    set ::id {}
}
puts \$::id=$::id