如何在pygtk中运行无限while循环?

2024-10-01 04:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在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公司()最后:

^{pr2}$

它可以工作,但是s.accept()导致了与前面相同的问题……有人能帮忙吗


Tags: 代码服务器应用程序示例类型gtk客户机main
3条回答

你可以用第二根线(docs.python.org/library/threading.html)。还有一种方法将gtk合并到循环中(通过使用pygtk.org/docs/pygtk/…)但是既然你提到了网络,我猜你是在使用阻塞调用,这也会阻止循环,直到网络发生了什么。不过,我只能猜测,直到你给我们看一些实际的代码。在

您可以通过以下方式强制应用程序处理挂起的gtk事件:

while True:
    #your code 

    while gtk.events_pending():
        gtk.main_iteration()

但是,如果“你的代码”需要一段时间来执行,你应该考虑在后台进程中实现它。在

即使没有看到任何代码,我很确定我知道这个问题的方向。pygtk可能与其他GUI框架没有什么不同,因为它的主循环是一个事件循环。应用程序中的所有小部件都将其事件注册到此循环中,以便应用程序正常运行。在这些事件驱动的GUI框架中,永远不要阻塞主线程。主线程中的所有操作都应该相对快速地返回。在

当您需要执行将要阻塞或执行大量处理的操作时,应该将此功能移到单独的线程中。如果您的网络循环将永远阻塞在它自己的事件循环中,则需要这样做。如果是这样的话,你别无选择,只能使用线程。在

我不是特别熟悉pygtk,但是PyQt/PySide提供了一个函数,可以让您告诉事件循环来处理。您可以将其插入在主线程中执行的循环中,以定期刷新事件。这将是在另一个线程中运行进程的替代方法。但同样,只有当你的其他代码没有阻塞,并且只是反复循环。在

相关问题 更多 >