我有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
有人能告诉我什么错吗? 提前谢谢......
答案 0 :(得分:0)
主循环调用菜单项的处理程序,并在它执行任何其他操作之前等待它返回,包括关闭菜单以使对话框得到焦点。
最简单的解决方法可能是使用timeout_add在主循环到达时调用连接检查,即在显示对话框之后。
答案 1 :(得分:0)
您需要重构check_network()以使其无阻塞。
不要在某个套接字上进行阻塞调用,而是使用gobject.io_add_watch()注册一个回调,一旦数据准备好为套接字,就会收到回调。在此回调中,您可以更新或销毁弹出窗口。
在Linux上GTK很可能会使用场景后面的select系统调用,它可以等待任何数量的超时文件描述符事件,包括套接字和FIFO(如果你产生子进程)。
这个概念被称为“基于事件的编程”。您只有一个执行线程。几乎每个GUI框架都以这种方式工作。这个想法是你永远不会做任何可能需要超过几毫秒的事情。这是一个很好的概念,因为它避免了真正并发线程同步时出现的所有毛病问题。