我正在举办活动:例如:event1,event2,event3,event4&事件5&当事件按事件执行时,某些参数仅在第5个事件时遇到。
我想在第一场比赛中使用或推动这些参数,或者在第一场比赛中展望未来。使用这些参数来做出决定。
我们怎么做这个TCL?我们可以使用uplevel或upvar吗?
答案 0 :(得分:1)
最简单的方法是使用全局变量来保存您希望继承的值。使用全局变量(或由原始窗口小部件名称索引的数组,如果它是合理的,通常是这样)是正常的,因为用户在与程序交互时往往只生成单个事件序列。一个很好的例子就是拖放系统。
bind .abc <ButtonPress-1> {startDrag %W %X %Y}
bind .abc <B1-Motion> {continueDrag %W %X %Y}
bind .abc <ButtonRelease-1> {finishDrag %W %X %Y}
proc startDrag {w x y} {
global drag
set drag(origin,$w) [list $x $y]
# Other stuff to change cursors, setup drag indicators, etc.
puts "started drag from ($x,$y) where the widget is $w"
}
proc continueDrag {w x y} {
global drag
lassign $drag(origin,$w) originalX originalY
# Update any drag/drop indicators
puts "dragged from ($originalX,$originalY) to ($x,$y) where the widget is '[winfo containing $x $y]'"
}
proc finishDrag {w x y} {
global drag
lassign $drag(origin,$w) originalX originalY
# Do the drop
puts "dropped at ($x,$y) over '[winfo containing $x $y]' with a drag that started at ($originalX,$originalY)"
# Clean up the global(s); not required, but a good habit...
unset drag(origin,$w)
}
Tk在内部使用了这种东西。您也可以直接使用全局来保留小部件,但由于每当鼠标按钮关闭时自动应用grab
,因此拖放操作不需要这样做(很少)窗口系统的已知功能......)