tk eventspending?



如何刷新tk gui,而在一个按钮回调例程内做一些计算?

例程需要很长时间,用户希望看到一些进展。

需要重新绘制屏幕/寻找取消按钮。

GTK中的

是这样的:

/* computation going on */
...
    while (gtk_events_pending ())
      gtk_main_iteration ();
...
/* computation continued */

与GTK代码片段等价的是update方法(任何小部件)。在内部,它几乎做同样的事情(即,它处理事件,直到没有更多的事情要做,但不会等待任何事情发生)。

请注意,update为回调引入了可重入调用的可能性;如果一个事件连续发生两次(在GUI代码中很容易发生),那么最终可能会在自己内部运行。大多数时候你可能会侥幸逃脱,但这太容易惹上麻烦了。引入某种联锁(例如,在处理命令时禁用按钮,这也是一个很好的视觉隐喻)是解决这个问题的好方法。

我可能错过了这一点,但为什么不使用线程呢?您将无法在回调中加入它,但您仍然应该能够生成事件。

TkButton.new :text => 'Hard routine',
             :command => proc { Thread.new { hard_routine } }.pack
Tk.mainloop

在你的回调中做重的事情被认为是一个不好的做法,因为它阻塞了整个事件循环,所以你的GUI冻结。

相关内容

  • 没有找到相关文章

最新更新