我在pygtk中创建一个涉及运行无限循环的应用程序。我认为循环干扰了gtk.main(),因此应用程序没有响应。实际上,我正在构建一个服务器类型的应用程序,它不断地监听客户端连接.Plzzz帮助......我是一个新手。
这是我最初尝试做的一个示例。(对于那些想要代码的人)
while 1:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',2727))
s.listen(1)
c,d=s.accept()
print d
x=c.recv(1024)
我最后用:
替换gtk.main()while 1:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',2727))
s.listen(1)
s.accept()
gtk.main_iteration_do(False)
它会起作用,但s.accept()会导致与之前相同的问题....有人可以提供帮助
答案 0 :(得分:2)
您可以通过以下方式强制您的应用程序处理挂起的gtk事件:
while True:
#your code
while gtk.events_pending():
gtk.main_iteration()
但是,如果“您的代码”需要一段时间才能执行,您应该考虑在后台进程中实现它。
答案 1 :(得分:1)
您可以使用第二个帖子(docs.python.org/library/threading.html)。还有一种方法在你的循环中包含gtk(通过使用pygtk.org/docs/pygtk / ...),但是既然你提到了网络,我猜你正在使用阻塞调用,这也会阻止循环直到网络上发生某些事情。但是我只能猜测,直到你向我们展示一些实际的代码。
答案 2 :(得分:0)
即使没有看到任何代码,我也很确定我知道这个问题在哪里。 pygtk可能与其他GUI框架没什么区别,因为它的主循环是一个事件循环。应用程序中的所有小部件都将其事件注册到此循环,以使您的应用程序正常运行。在这些事件驱动的GUI框架中,您绝不应该阻止主线程。主线程中的所有操作都应该相对快速地返回。
当您需要执行阻止或执行大量处理的操作时,应将此功能移至单独的线程。如果您的网络循环将在其自己的事件循环中永远阻塞,则需要这样做。如果是这种情况,你就别无选择,只能使用一个帖子。
我并不是特别熟悉pygtk,但是PyQt / PySide提供了一个函数,可以告诉事件循环处理。您可以将其放在主线程中执行的循环内,以定期刷新事件。这将是在另一个线程中运行进程的替代方法。但同样,只有当你的其他代码没有阻塞时,才会反复循环。