如何在按钮回调例程中进行一些计算时刷新tk gui?
该例程需要很长时间,并且用户希望看到一些进展。
需要一些方法来重新绘制屏幕/查找取消按钮。
在gtk中是这样的:
/* computation going on */
...
while (gtk_events_pending ())
gtk_main_iteration ();
...
/* computation continued */发布于 2011-08-18 14:32:39
我可能没有抓住要点,但是你为什么不使用线程呢?您不能在回调中加入它,但您应该仍然能够生成事件。
TkButton.new :text => 'Hard routine',
:command => proc { Thread.new { hard_routine } }.pack
Tk.mainloop在回调中做繁重的事情被认为是一种糟糕的做法,因为它会阻塞整个事件循环,因此您的gui会冻结。
发布于 2011-08-19 16:47:54
与GTK代码片段等效的是(任何小部件的) update方法。在内部,它几乎做了完全相同的事情(即,它处理事件,直到没有更多的事情要做,但不会等待之后的任何事情)。
请注意,update引入了对回调的可重入调用的可能性;如果一个事件快速连续发生两次(在图形用户界面代码中非常容易发生),则有可能最终在其内部运行程序。你可能大部分时间都能幸免于难,但它很容易陷入严重的麻烦。引入某种类型的互锁(例如,在处理命令时禁用按钮,这也是一个很好的视觉隐喻)是一个很好的解决方法。
https://stackoverflow.com/questions/7103047
复制相似问题