【发布时间】:2014-08-19 00:10:47
【问题描述】:
考虑以下情况:
namespace eval ::mydialog {}
proc ::mydialog::show {w varName args} {
upvar 1 $varName theVar
# now I can access theVar
# (1)
# code defining/creating my window
# here some widgets for user interaction are created,
# some of which will call ::mydialog::_someCallback
wm protocol $w WM_DELETE_WINDOW [list ::mydialog::close $w]
}
proc ::mydialog::_someCallback {} {
# how do I access theVar here?
# (2)
}
proc ::mydialog::close { w } {
# here some changes are supposed to be written back into varName in the calling scope,
# how do I do that?!
# (3)
destroy $w
}
我试图弄清楚如何 (a) 从调用范围获取一个变量 (b) 在所有三个 proc 中都可用,以及 (c) 将任何更改写回所述变量。
(a) 我通常会使用 'upvar 1 $varName theVar' 来解决 (b) 我通常会使用命名空间变量来解决 (c) 只要我们只有一个 proc 会与 (a) 一起自动发生,因为我们将处理该变量的本地别名
问题在于 upvar 仅在 (1) 中有效(至少按预期)。 我可以在 (1) 中使用 upvar 并将其保存/复制到命名空间变量中,这将解决 (a) 和 (b),但不能解决 (c)。
如果有人能在这里指出正确的方向,我将不胜感激。
另外,由于我对 Tcl/Tk 比较陌生,我的概念可能并不理想,也欢迎提出更好的设计建议。
【问题讨论】:
-
我不完全确定您要做什么,但是您可以使用
theVar调用proc 并在proc 末尾使用return来检索theVar有或没有变化。也许您可以在此处和此处(例如在调用不同的 proc 之前和之后)放置一些可重复的小 sn-p 您想要获得的内容,并说出您期望得到的内容。 -
@Jerry 将 VAr 作为参数传递并使用 return 将其返回将适用于“正常”过程。但不是介于两者之间的 tk 对话框/窗口。问题是 ::mydialog::show 与应该设置新值的回调函数(例如,对于按钮单击)没有直接的“连接”/关系。正如 Hoodiecrow 指出的那样,可以使用全局命名空间作为参考点将它们联系在一起。我不确定我是否喜欢这样(从设计的角度来看),但我没有看到其他方式。
标签: namespaces tcl tk upvar