我有这个 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/