GUI와 네트워크 프로그래밍과 관련하여이 시점에서 저는 여전히 멍청한 상태입니다. 그래서 이것이 매우 간단한 수정이되기를 바랍니다. 나는 tkinter와 asyncore 모듈에 대해 아주 기본적인 이해를하고있다. 그러나 각각의 프로그램에 소수의 프로그램을 내장하고 있지만, 프로그램에서이 둘을 함께 사용하는 데 어려움을 겪고있다. 모든 중요한 비동기 네트워킹 기능을 얻을 수 없다는 것을 알아 내기 위해서만 전체 UI를 조합했습니다. 간단히하기 위해 나는 기본적인 문제를 설명하기 위해 프로그램을 가장 단순한 형태로 분해했다. Heres는 코드 : I 버튼을 프로그램을 실행하고 클릭하면Asyncore가 Tkinter GUI와 제대로 작동하지 않습니다.
from Tkinter import *
import asyncore, socket
class Application(object):
def __init__(self, root):
mainFrame = Frame(root)
mainFrame.grid(column=1, row=1, columnspan=3, rowspan=1)
mainButton = Button(mainFrame, text='Click', command=self.makeSocket)
mainButton.grid(column=2, row=1, columnspan=1, rowspan=1, pady=7, padx=40)
def makeSocket(self):
clientSocket()
class clientSocket(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect(("XXX.XXX.XXX.XXX", XXXX))
print 'init works'
def handle_connect(self):
print 'connect works'
root = Tk()
myApp = Application(root)
root.after_idle(asyncore.loop)
root.mainloop()
그래서, 나는 clientSocket 객체가 초기화되는 것을 나타내는 문자열 '초기화 작동'를 얻을 연결이 성공적으로 이루어집니다. 그러나 handle_connect 메소드는 실행되지 않습니다. 그리고 handle_read 메소드를 구현하고 서버에 명령을 실행하면 (클라이언트에 데이터를 다시 보내기 위해)이 메소드는 호출되지 않습니다. asyncore 루프가 자체적으로 실행되는 것을 막는 일반적인 문제가 있다고 생각합니다. tkinters 이벤트 루프가 범인이 될 수 있다는 것을 알았지 만 GUI가 유휴 상태 일 때 after_idle 메서드가 non-Tkinter 이벤트를 처리 할 수 있다는 인상하에있었습니다. 여전히 문제를 일으키는 tkinter 이벤트 루프입니까 아니면 다른 것일 수 있습니까?
asyncore는 가치가있는 것으로, 표준 라이브러리에서 여전히 호환성을 유지하면서도 매우 어렵고 까다로운 Python 기술로, 현대 프로젝트에서는별로 좋지 않습니다. 더 나은 비동기 프레임 워크가 필요한 경우 Twisted Python을 사용해보십시오. (그리고 나는 Twisted를 가볍게하지 않는 것이 좋습니다!) –