如何在窗口调整至目标尺寸后再执行耗时函数?
解决窗口尺寸调整时仅在稳定后执行耗时函数的方案
核心思路是防抖(Debounce):每次触发<Configure>事件时,取消之前待执行的延迟任务,重新设置新的延迟,只有当延迟期间没有新事件触发时,才执行目标函数。
具体实现代码如下:
set originalWidth 500 set originalHeight 500 # 存储延迟任务的ID,用于后续取消操作 set config_after_id "" bind .l <Configure> [list procConfig %W %w %h] proc procConfig {W w h} { global config_after_id originalWidth originalHeight # 取消之前未执行的延迟任务 if {$config_after_id ne ""} { after cancel $config_after_id set config_after_id "" } # 仅当尺寸与原始值不同时,设置新的延迟执行任务 if {($w != $originalWidth) || ($h != $originalHeight)} { # 延迟时间可按需调整(示例为200毫秒) set config_after_id [after 200 [list myfunction "arg1" "arg2"]] } }
关键说明:
- 用全局变量
config_after_id追踪延迟任务,每次触发调整事件时先取消旧任务,避免myfunction在调整过程中频繁执行。 - 延迟时间可根据实际场景调整(200ms是兼顾响应速度和防抖效果的常用值)。
- 若窗口最终回到原始尺寸,不会触发
myfunction,符合初始逻辑要求。
你之前的递归after方案会持续轮询执行,反而会导致函数频繁触发,而防抖方案仅在用户停止调整窗口后执行一次,效率更高。
内容的提问来源于stack exchange,提问作者Mkn
相关产品推荐
相关产品推荐

