在
bugd
中,总是会需要弹出一些信息框来收集一些用户选项,其中不乏类似于
combobox
这样提供一串信息的。针对不同的弹出框,应该有不同的信息来填充。更一般的说,针对不同的框,应该有其特有的一组数据。为了区别这些框,不得不维护一个全局变量来存储显示在最外层的
toplevel
的路径,在其退出之后再被重新赋予下一个层次的
toplevel
,直至到“
.
”。这不是一个好办法,因为为了存储这一系列的变化,必须对应数量可观的全局变量,至少两个:一个前一次,一个当前,而这仅仅是应对单层次弹出的情况。
其实很容易想到的一个办法是维护一个堆栈,一旦有新的
toplevel
出现,就被压入堆栈,销毁的时候在
pop
出来。我们不需要为此修改每一个
toplevel
的构造函数,只需要建立
<Map>
和
<Destroy>
的事件句柄。举个例子如下:
bind Toplevel <Map> {_tPush %W}
bind Toplevel <Destroy> {_tPop %W}
proc _tPush {w} {
global top_stack
if {[lindex $top_stack 0] ne $w} {
set top_stack [linsert $top_stack 0 $w]
}
}
proc _tPop {w} {
global top_stack
if {[lindex $top_stack 0] eq $w} {
set top_stack [lreplace $top_stack 0 0]
}
}