【问题标题】:How to run an infinite while loop in pygtk?如何在pygtk中运行无限while循环?
【发布时间】:2012-04-08 17:45:10
【问题描述】:

我正在 pygtk 中创建一个涉及运行无限循环的应用程序。我认为,循环会干扰 witk 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() 会导致与之前相同的问题....有人可以帮忙

【问题讨论】:

  • 如果不显示一些代码就无法回答这个问题。
  • @EmilVikström:通常我会同意。但是我认为在这种情况下,仍然可以给出一个很好的答案来涵盖一般问题。

标签: python loops while-loop pygtk


【解决方案1】:

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

while True:
    #your code 

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

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

【讨论】:

  • 如果他的代码使用阻塞调用(socket 的东西),那么 UI 可能仍然没有响应
  • 网络库很可能会有自己的事件循环来监听客户端的连接和阻塞。
  • 这只是一个提示,如果监听套接字没有超时,这将不起作用。正如前面提到的,通信应该在另一个线程中实现
  • 我已经放了代码。我想以多线程以外的方式来做这件事,因为它有时会让人困惑。
【解决方案2】:

您可以使用第二个线程 (docs.python.org/library/threading.html)。还有一种方法将 gtk 合并到您的循环中(通过使用 pygtk.org/docs/pygtk/...),但是由于您提到网络,我猜您正在使用阻塞调用,它也会阻塞循环,直到网络上发生某些事情。但是,我只能猜测,直到您向我们展示一些实际代码。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 2023-03-29
      • 2014-01-30
      • 1970-01-01
      • 2021-05-06
      • 2020-03-01
      • 2014-03-29
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多