Python - 如何运行 gtk.main() 不会阻塞我的整个应用程序并允许我进行多任务处理?

标签 python linux python-2.7 gtk pygtk

我有这个 Python 框架,其中 main.py 和 server.py 都很好。但是启动 chat() 的那一刻我看到了 GUI,但是当 gtk.main() 被执行时,它不允许在 server.py 模块下或 chat.py 本身中进行任何事件。

我怎样才能使 chat.py 灵活,以便它不会中断其他类并像多任务一样运行?

注意:当我从 server.py 执行时,os.system('/var/tmp/chat.py') 没有问题,但我的问题是我无法以这种方式进行通信(因此尽量避免使用该方法)

任何想法,为什么以及如何让 chat.py 独立工作,而不会导致我的整个应用程序被阻塞,直到 chat.py 退出?

主要.py:

#!/usr/bin/python
from myglobal import bgcolors
from myglobal import parsePresets
from server import server
from chat import chat
t = server(58888)
t.start()

服务器.py

class server(threading.Thread):
  def __init__(self, port):
    threading.Thread.__init__(self)
    self.port = port
    self.selfv = chat()
    self.selfv.run()

  def run(self):
    host = ''
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, self.port))
    #s.setblocking(0) # non-blocking
    s.listen(1)
    conn, addr = s.accept()
    serverFlag = True
    while serverFlag:
      try:
        data = conn.recv(1024)
      except socket.error:
        s.listen(1)
        conn, addr = s.accept()
        continue

      if not data:
        s.listen(1)
        conn, addr = s.accept()
      else:
        line = data
        conn.send('ok')
        conn.close()

聊天.py

class chat(object):

  def listener(self, sock, *args):
    conn, addr = sock.accept()
    gobject.io_add_watch(conn, gobject.IO_IN, self.handler)
    return True

  def handler(self, conn, *args):
    line = conn.recv(4096)
    if not len(line):
      return False
    else:
      return True

  def __init__(self):
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_size_request(800, 450)
    self.window.move(0,0)
    self.window.set_name("main window")
    self.window.connect("delete-event", gtk.main_quit)
    self.drawingarea = gtk.DrawingArea()
    self.window.add(self.drawingarea)

  def run(self):
    self.sock = socket.socket()
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind(('', 58881))
    self.sock.listen(1)
    gobject.io_add_watch(self.sock, gobject.IO_IN, self.listener)
    self.window.show_all()
    self.window.set_keep_above(True)
    if(self.window.get_window().get_state() == gtk.gdk.WINDOW_STATE_MAXIMIZED):
      self.window.unmaximize()
    gtk.main()

  def quit(self):
    gtk.main_quit()


#if __name__=='__main__':
#    s=SelfView()
#    s.run()
    #gobject.MainLoop.run()

最佳答案

我遗漏了太多东西来测试你的代码,所以我的回答不会很自信。

server 对象的构造函数调用 chat 对象的 run 方法,后者又调用 gtk.main( )。这将开始运行 GTK 的事件循环,因此在用户关闭 GUI 之前,该线程中不会再发生任何事情。实际上,您的服务器线程的 start 方法没有机会被执行。

我想你想在不同的线程上运行 gtk.main()。要建议如何执行此操作,恐怕我需要有关您要执行的操作的更多信息。也许您还需要使 chat 对象成为 threading.Thread 的实例。

关于Python - 如何运行 gtk.main() 不会阻塞我的整个应用程序并允许我进行多任务处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18942003/

相关文章:

python - 导入声明全局变量的函数

Python,如何跟踪全局变量

c - 如何向从 shell 脚本启动的所有进程发送 SIGSTOP

linux - 需要帮助找出远程缓冲区溢出

python - Tensorflow 磁贴抛出 TypeError : List of Tensors when single Tensor expected

python - 需要在代码中添加什么来删除配置文件中的空格?

python:压缩csv缓冲区

python - 使 Flask block 过载?

python - 如何在 PySpark 中进行聚合和转置?

python - 如何更改 Bokeh 使用的 Python 版本?