如何刷新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冻结。