gpt4 book ai didi

namespaces - 如何通过 tk 窗口按名称更新变量

转载 作者:行者123 更新时间:2023-12-04 17:03:17 25 4
gpt4 key购买 nike

考虑以下情况:

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)让它在所有三个过程中都可用,以及(c)将任何更改写回所述变量。

(a) 我通常会使用 'upvar 1 $varName theVar' 解决
(b) 我通常会用命名空间变量来解决
(c) 只要我们只有一个 proc 会随着 (a) 自动发生,因为我们将处理该变量的本地别名

问题是 upvar 仅适用于(至少按预期)在(1)中。
我可以在 (1) 中使用 upvar 并保存/复制到命名空间变量中,这将解决 (a) 和 (b),但不能解决 (c)。

如果有人能在这里指出我正确的方向,我将不胜感激。

此外,由于我对 Tcl/Tk 比较陌生,因此我的概念可能并不理想,也欢迎提出更好的设计建议。

最佳答案

我建议您使用保留变量名称的命名空间变量,以及 upvar使用全局范围。

namespace eval ::mydialog {
variable varName
}

proc ::mydialog::show {w _varName args} {
variable varName $_varName
upvar #0 $varName theVar

}

proc ::mydialog::_someCallback {} {
variable varName
upvar #0 $varName theVar
puts $theVar
}

proc ::mydialog::close { w } {
variable varName
upvar #0 $varName theVar
set theVar newval
}

set globalvar oldval
# => oldval
::mydialog::show {} globalvar
::mydialog::_someCallback
# => oldval
::mydialog::close {}
# => newval
puts $globalvar
# => newval

注意语法高亮失败: #0 $varName theVar真的不是评论。

这也适用于命名空间变量:如果您有一个名为 nsvar 的变量在 ::foobar命名空间,您可以像这样使用它:
set ::foobar::nsvar oldval
::mydialog::show {} ::foobar::nsvar
::mydialog::_someCallback
::mydialog::close {}
puts $::foobar::nsvar

具有相同的效果。

但是,您不能以这种方式使用某些过程的局部变量。

使这变得真正简单的一种方法是使用 Snit 小部件而不是 Tcl 过程的集合。

文档: namespace , proc , puts , set , upvar , variable

Snit 文档: man page , faq (常见问题也是一种介绍)

关于namespaces - 如何通过 tk 窗口按名称更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com