Рассмотрим следующую ситуацию:
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) Обычно я решаю, используя 'upvar 1 $varName theVar' (b) Обычно я решаю с помощью переменной пространства имен (c) Пока у нас есть только один процесс, который будет происходить автоматически с (a) из-за того, что мы будем работать над локальным псевдонимом этой переменной
Проблема в том, что upvar работает (по крайней мере, как задумано) только в (1). Я мог бы использовать upvar в (1) и сохранить/скопировать в переменную пространства имен, что решит (a) и (b), но не (c).
Я был бы признателен, если бы кто-то мог указать мне в правильном направлении здесь.
Кроме того, поскольку я относительно новичок в Tcl/Tk, моя концепция может быть не идеальной, поэтому предложения по улучшению дизайна также приветствуются.
theVar
и использоватьreturn
в конце процедуры, чтобы получитьtheVar
с изменениями или без них. Может быть, вы могли бы поместить небольшой воспроизводимый фрагмент того, что вы хотите получить, возможно, с некоторымиputs
здесь и там (например, до и после вызова разных процессов) и сказать, что вы ожидали получить. - person Jerry   schedule 18.08.2014