Tcl/Tk绑定需要全局变量吗?

Tcl/Tk绑定需要全局变量吗?,tcl,tk,Tcl,Tk,我有一个控制自动测试仪的Tcl脚本。到目前为止,它是一个在命令提示符下接受用户输入的控制台程序。一位同事编写了一个可以通过脚本启动的Tk GUI。我自己从未使用过Tk,所以我不太懂很多语法 在测试开始时,脚本必须从操作员处获得装置序列号。这就是我同事写的函数: proc GetSerialNumber {} { global gUserInterfaceBarCode DisplayMessage "Enter serial number:" .c.serialnumberbox co

我有一个控制自动测试仪的Tcl脚本。到目前为止,它是一个在命令提示符下接受用户输入的控制台程序。一位同事编写了一个可以通过脚本启动的Tk GUI。我自己从未使用过Tk,所以我不太懂很多语法

在测试开始时,脚本必须从操作员处获得装置序列号。这就是我同事写的函数:

proc GetSerialNumber {} {
 global gUserInterfaceBarCode

 DisplayMessage "Enter serial number:"

 .c.serialnumberbox configure -state normal

 focus .c.serialnumberbox

 bind .c.serialnumberbox <Return> { set gUserInterfaceBarCode [.c.serialnumberbox get] }

 tkwait variable gUserInterfaceBarCode

 #grid forget .c.serialnumberbox

 .c.serialnumberbox configure -state disabled

}
proc GetSerialNumber{}{
全局GuserInterface条码
显示消息“输入序列号:”
.c.serialnumberbox配置-状态正常
focus.c.serialnumberbox
bind.c.serialnumberbox{set gUserInterfaceBarCode[.c.serialnumberbox get]}
tkwait变量guserInterface条码
#grid.c.serialnumberbox
.c.serialnumberbox配置-状态已禁用
}
DisplayMessage
是一个简单地更新GUI上的文本标签的过程

我不喜欢全局变量
gUserInterfaceBarCode
用于保存序列号。有没有办法改用局部变量并让过程返回该值


如果我理解正确,如果取出行
tkwait变量gUserInterfaceBarCode
,此函数将不会阻塞,直到该变量更改。这是从GUI元素捕获用户输入的最佳方法吗?

基本上,您需要有一个变量等待。不幸的是,
的代码是在与proc中的代码不同的上下文(全局上下文)中执行的,并且该代码无法处理proc中的局部变量

然而,它本身并不一定是一个全局变量——它只需要是全局可寻址的,我的意思是,如果这让您感觉更好,您可以使用名称空间变量:

namespace eval GetSerialNumber {
    proc GetSerialNumber {} {

        DisplayMessage "Enter serial number:"
        .c.serialnumberbox configure -state normal
        focus .c.serialnumberbox
        bind .c.serialnumberbox <Return> { set ::GetSerialNumber::result [.c.serialnumberbox get] }
        tkwait variable ::GetSerialNumber::result
        .c.serialnumberbox configure -state disabled
        return $::GetSerialNumber::result
    }
}

set serialNum [GetSerialNumber::GetSerialNumber]

值得一提的是,Tk核心实现将名称空间方法用于自己的内置对话框实现,如“打开文件”对话框。

Tk脚本还将任何模糊复杂的内容放入自己的帮助程序中,因为大多数Tcl OO扩展都允许对象实例变量看起来像命名空间变量,所以您也可以使用OO扩展稍微封装变量。第三种方法是为所有状态使用一个全局数组变量,而不是为每个值使用一个变量名。
tkwait variable ::gUserInterfaceBarCode
set result $::gUserInterfaceBarCode
unset ::gUserInterfaceBarCode
return $result