繁体   English   中英

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

[英]How to run an infinite while loop in pygtk?

我正在 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() 会导致与之前相同的问题....有人可以帮忙吗

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

while True:
    #your code 

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM