2013-07-13 52 views
1

我在我的ruby gtk2应用程序中使用了一个按钮,它启动了一个长时间的作业处理,我想在处理时禁用该按钮,以便用户不会意外地运行它两次。我想设置button.sensitive = false会做的工作,用下面的代码进行了测试:Ruby gtk2:button.sensitive = false - 事件仍然排队

button.signal_connect(:clicked) do 
    button.sensitive = false 
    puts "clicked" 
    sleep 5 
    button.sensitive = true 
end 

点击按钮上的工作开始后,似乎仍然把:clicked事件堆栈上,所以如果我按一下按钮时的两倍多sleep,'clicked'在控制台窗口中显示三次,当我预料它只会出现一次。

我误解了这是如何工作的?如果它不能按我期望的方式工作,那么在作业完成后是否有办法清除事件堆栈?

+0

没有信号处理程序返回到主循环成为设置有效吗?只是猜测,到目前为止还没有用过Gtk2。 – Torimus

回答

0

谢谢你,托里莫斯 - 指出我在正确的方向。显然这有助于你阅读文档,特别是Gtk.events_pending?!在设置button.sensitive以强制主循环完成之后添加以下内容:

while Gtk.events_pending? do 
    Gtk.main_iteration 
end