如何运行一个无限的,而在PyGTK的循环?(How to run an infinite while

2019-10-16 13:39发布

我创造的PyGTK其包括运行一个无限循环的应用程序。 循环,我认为,干扰witk gtk.main(),因此应用程序没有响应。 其实,我建立一个服务器类型的应用程序,它为客户connections.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()会导致同样的问题,正如前面....谁能帮助

Answer 1:

你可以迫使你的应用程序来处理未决的GTK活动方式如下:

while True:
    #your code 

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

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



Answer 2:

你可以使用第二个线程(docs.python.org/library/threading.html)。 也有在循环的方式一体化GTK(通过使用pygtk.org/docs/pygtk/...),但既然你提到的网络我猜你正在使用阻塞调用,也将阻止循环,直到事情发生在网络上。 但是我只能猜测,直到你告诉我们一些实际的代码。



Answer 3:

即使没有看到任何代码,我敢肯定我知道这个问题是怎么回事。 PyGTK是大概没有比它的主循环是一个事件循环其他GUI框架不同。 在应用程序中所有登记的小部件的事件,这个循环为您的应用程序的功能。 在这些事件驱动的GUI框架,你应该永远不会阻塞主线程。 在主线程中的所有操作都应该返回比较快。

当您需要执行会阻止或执行处理大量的东西,这个功能应该移到一个单独的线程。 这会,如果你的网络环路是要在自己的事件永远循环块需要。 如果是这样的话,你就别无选择,只能使用一个线程。

我不是特别熟悉的PyGTK,但PyQt的/ PySide提供了一个功能,您可以让事件循环处理。 你能坚持这一点,你执行你的主线程定期刷新事件一个循环内。 这将是在另一个线程运行的进程的替代品。 但同样,只有当你的其他代码就不会阻止,并简单地循环一遍又一遍。



文章来源: How to run an infinite while loop in pygtk?