pygtk弹出窗口执行乱序

时间:2011-09-29 13:39:23

标签: python pygtk

我有pygtk菜单,其中一个函数在menuitem点击上调用,在这个函数中,我向用户显示一个弹出窗口,说等待检查互联网连接,然后调用检查互联网连接的功能,

我的问题是我的程序首先调用互联网连接检查功能,然后在完成函数调用后它显示弹出窗口,

我尝试过,

 while gtk.events_pending():     
      gtk.main_iteration_do(False)

它显示模糊弹出窗口,挂起直到我的函数调用完成然后变得清晰。

我的代码看起来像,

dialog = gtk.MessageDialog(
        parent         = None,
        flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
        type           = gtk.MESSAGE_INFO,
        buttons        = gtk.BUTTONS_NONE,
        message_format = None)
        dialog.set_markup("Please wait while checking internet connectivity")
        dialog.set_title('Checking internet')
        dialog.set_position(gtk.WIN_POS_CENTER)
        dialog.connect('response', self.show_hide, dialog )
        dialog.show()
        gobject.timeout_add(5, self.show_hide, dialog)
 try :
        netStatus = check_network()
 except Exception, excp:
        print excp

有人能告诉我什么错吗? 提前谢谢......

2 个答案:

答案 0 :(得分:0)

主循环调用菜单项的处理程序,并在它执行任何其他操作之前等待它返回,包括关闭菜单以使对话框得到焦点。

最简单的解决方法可能是使用timeout_add在主循环到达时调用连接检查,即在显示对话框之后。

答案 1 :(得分:0)

您需要重构check_network()以使其无阻塞。

不要在某个套接字上进行阻塞调用,而是使用gobject.io_add_watch()注册一个回调,一旦数据准备好为套接字,就会收到回调。在此回调中,您可以更新或销毁弹出窗口。

在Linux上GTK很可能会使用场景后面的select系统调用,它可以等待任何数量的超时文件描述符事件,包括套接字和FIFO(如果你产生子进程)。

这个概念被称为“基于事件的编程”。您只有一个执行线程。几乎每个GUI框架都以这种方式工作。这个想法是你永远不会做任何可能需要超过几毫秒的事情。这是一个很好的概念,因为它避免了真正并发线程同步时出现的所有毛病问题。