我在Tcl / Tk中有一个简单的窗口,在按下OK按钮时会运行模拟。我正在使用Linux。模拟完成后,窗口将被销毁。问题是在模拟运行时窗口依赖。我点击OK按钮后希望窗口消失。
我尝试使用wm withdraw .mywindow
,但它使显示窗口的区域(包含OK按钮)变为白色。
我在谷歌搜索时发现update
,但据说是harmful。
答案 0 :(得分:3)
如果你执行wm withdraw .mywindow
,在进入事件循环之前,窗口实际上不会消失,因为它是处理重绘屏幕的事件循环。
您有几个选择来解决您的问题。例如,您可以拨打update idletasks。这是update
的变体,它只处理“空闲”任务,例如绘制屏幕,而不是响应按钮和其他用户生成的事件等任务。所以,解决方案之一就是:
wm withdraw .mywindow
update idletasks
run_simulation
顺便说一下,update
有害的原因是因为它本质上启动了一个新的事件循环 - 另一个无限循环。如果在该事件循环期间出现导致相同代码再次运行的事件,则启动第三个和第四个,依此类推。作为一般规则,嵌套无限循环永远不是一件好事。请记住:tcl是单线程的,因此这些事件循环不会并行运行。
另一种解决方案是自然地进入事件循环,并在处理完所有其他事件后安排模拟运行。这样做,使用after命令开始模拟。使用after
会在事件队列中放置一个事件。当事件循环到达该事件时,您的模拟将开始。
例如:
wm withdraw .mywindow
after idle run_simulation
当上述代码退出时 - 假设它是由于按下按钮或键等事件而调用的 - 将重新输入事件循环,将处理任何待处理事件,然后处理{{1命令将运行。
顺便说一下 - 如果你的模拟运行时需要响应的GUI,你应该阅读tcler维基上的Keep a GUI alive during a long calculation。那里有很多东西可以让它看起来比现在看起来更难,但它并不像它最初看起来那么复杂。