我需要在窗口大小改变时立即执行一个函数,这个函数非常消耗像这样的:
set originalWidth 500
set originalHeight 500
bind .l <Configure> [list procConfig %W %w %h]
proc procConfig {W w h} {
if {($w != $::originalWidth) || ($h != $::originalHeight)} {
myfunction "arg1" "arg2"
}
}
我遇到的问题是,一旦尺寸发生变化,
myfunction
就会执行,而不是在我释放鼠标按钮后执行(或者我的小部件.l
设置为正确的大小)。
有没有办法阻止 myfunction
的执行,并在获得所需尺寸后执行它?
编辑:
我尝试使用
after
命令实现另一个解决方案
procConfig2 .l ; # recursive proc
proc procConfig2 {W} {
if {([winfo width $W] != $::originalWidth) || ([winfo height $W] != $::originalHeight)} {
myfunction "arg1" "arg2"
}
after 10 [list procConfig2 $W]
}
但我得到了大致相同的结果。
您可以在
<Configure>
回调中设置一个标志,表示您 will 调用您的函数,然后实际上仅在您确定需要执行此操作时才调用它。困难在于,有时很难确定什么时候是正确的时间;如果它是由内部事件驱动的,那么您可以在 <ButtonRelease>
或类似的东西上执行此操作,但是当它是由窗口管理器的指令驱动时,则根本没有事件表明“用户已停止更改大小”。我想您可以设置一个延迟,以便它在最后一个运动事件后 100 毫秒发生,但这始终是一个猜测。 (您可以通过像以前一样设置后事件来做到这一点,但在下一个运动事件的处理程序开始时取消该事件。)