Tk 推迟窗口创建、几何计算(在设置窗口内容期间可能相当复杂且几乎毫无意义)和内容的实际绘制,直到应用程序处于空闲状态,即直到它处于事件循环中并且有没有待处理的真实事件。(从这个意义上说,定时器事件在它们触发之前不会挂起。)这通常是正确的做法:它使 Tk 对于几乎所有正常代码来说看起来都非常快。所有这些处理都是使用称为“空闲事件”的概念来处理的,Tk 在内部使用了很多,您可以使用 via 制作自己的after idle
。
然而,上一段的结果是你不能直接做你想做的事;在您询问有关窗口几何形状的当前信息时,它尚未被计算,因此您会得到一些(不相关的)默认值。您可以强制刷新挂起的空闲处理(使用update idletasks
,通常缩写为update idle
),但这可能会导致一些棘手的重入问题,并且还会触发难看的显示闪烁(因为映射和绘图,您不能也防止)。因此,您实际上应该做的是将几何调整本身推迟到它们自己的空闲事件,如下所示:
after idle {
wm geometry .sigsetting_menu [regsub {\d+x} [wm geometry .sigsetting_menu] "463x"]
}
如果您要做很多此类事情,请使用帮助程序来保持您的代码简单并list
生成回调(它完全正确地引用)。
proc setGeometryWidth {window width} {
wm geometry $window [regsub {\d+x} [wm geometry $window] "${width}x"]
}
after idle [list setGeometryWidth .sigsetting_menu 463]
另外,您确定将宽度设置为明确的像素数是否明智?高分辨率显示器即将问世……</p>