向前看功能或使用TCL中其他级别功能生成的一些参数

时间:2016-12-27 18:57:45

标签: tcl

我正在举办活动:例如:event1,event2,event3,event4&事件5&当事件按事件执行时,某些参数仅在第5个事件时遇到。

我想在第一场比赛中使用或推动这些参数,或者在第一场比赛中展望未来。使用这些参数来做出决定。

我们怎么做这个TCL?我们可以使用uplevel或upvar吗?

1 个答案:

答案 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,因此拖放操作不需要这样做(很少)窗口系统的已知功能......)