나는이 Python 해골을 가지고 있는데, main.py가 좋고 server.py가 좋다. 하지만 chat() 순간에 GUI가 보이지만, gtk.main()
이 실행되면 server.py 모듈이나 chat.py 자체에서 어떤 활동도 허용하지 않습니다.파이썬 - 내 전체 응용 프로그램을 차단하지 않고 멀티 태스킹을 수행 할 수있는 gtk.main()을 실행하는 방법은 무엇입니까?
어떻게 chat.py가 다른 클래스와 간섭하지 않고 멀티 태스킹처럼 실행되도록 유연하게 설정할 수 있습니까?
참고 : os.system ('/ var/tmp/chat.py')을 server.py에서 실행하면 아무런 문제가 없지만 문제는 발생하지 않습니다. (그렇게하면 해당 메소드를 피하려고합니다.)
어떤 생각, 왜, 어떻게 chat.py가 종료 될 때까지 전체 응용 프로그램을 차단하지 않고 독립적으로 작동하게 할 수 있습니까?
main.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()
server.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()
chat.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()
내가 언급 한 것처럼 chat.py를 만들었지 만 동일합니다. gtk.main()이 실행 되 자마자 다른 명령문이 작동하지 않습니다. – YumYumYum
'gtk.main()'을 호출하면 사용자가 GUI를 종료 할 때까지 반환되지 않습니다. 이 작업은 별도의 스레드에서 수행해야합니다. 'gtk.main()'에 대한 호출은 별도의 스레드의'run' 메소드에 있어야합니다. – nickie