繁体   English   中英

Tcl / Tk-如何在OK运行模拟时按下OK按钮使窗口消失

[英]Tcl/Tk - how to make a window vanish on hitting OK button when OK runs a simulation

我在Tcl / Tk中有一个简单的窗口,单击OK按钮即可运行模拟。 我正在使用Linux。 模拟完成后,窗口将被破坏。 问题是在运行模拟时窗口仍在继续。 我希望在单击“确定”按钮后窗口消失。

我尝试使用wm withdraw .mywindow但是它使显示窗口的区域(包含“确定”按钮)变为白色。

我在谷歌搜索时发现了update ,但据说这是有害的

如果执行wm withdraw .mywindow ,则在进入事件循环之前该窗口实际上不会消失,因为它是处理重画屏幕的事件循环。

您可以选择两种方法来解决问题。 首先,您可以调用update idletasks 这是update一种变体,仅处理诸如绘画屏幕之类的“空闲”任务,而不处理诸如响应按钮和其他用户生成的事件之类的任务。 因此,解决方案之一是:

wm withdraw .mywindow
update idletasks
run_simulation

顺便说一句, update之所以有害是因为它实际上会启动一个新的事件循环-另一个无限循环。 如果在该事件循环中发生了一个事件,该事件导致相同的代码再次运行,请启动第三个和第四个,依此类推。 通常,嵌套无限循环永远不是一件好事。 请记住:tcl是单线程的,因此这些事件循环不会并行运行。

另一种解决方案是自然地进入事件循环,并安排模拟在所有其他事件都处理后运行。 为此,请使用after命令启动仿真。 使用after将事件放置在事件队列中。 当事件循环到达该事件时,您的模拟将开始。

例如:

wm withdraw .mywindow
after idle run_simulation

当以上代码退出时(假设它是由于按下按钮或按键等事件而被调用的),将重新进入事件循环,将处理所有未决事件,然后运行run_simulation命令。

顺便说一句-如果您的GUI在运行模拟时需要响应,则应在tcler的Wiki上进行长时间计算后阅读“ 使GUI保持活动状态” 那里有很多文章可供阅读,这使问题看起来比实际困难,但并没有最初看起来的那么复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM