現時点では、GUI とネットワーク プログラミングに関してはまだ初心者なので、これが非常に簡単な修正になることを願っています。tkinter モジュールと asyncore モジュールについて、それぞれにいくつかのプログラムを構築することについて非常に基本的な理解がありますが、プログラムで両方を一緒に使用するのに問題があります。UI 全体をまとめてみたところ、重要な非同期ネットワーク機能を実現できなかったことがわかりました。簡単にするために、私が抱えている基本的な問題を説明するために、プログラムを最も単純な形式に分解しました。コードは次のとおりです。
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()
そのため、プログラムを実行してボタンをクリックすると、文字列「init works」が表示され、clientSocket オブジェクトが初期化され、接続が正常に確立されたことを示します。ただし、handle_connect メソッドは実行されません。また、handle_read メソッドを実装してサーバーでコマンドを実行すると (データをクライアントに送り返すため)、このメソッドも呼び出されません。非同期コア ループの単独での実行を妨げている一般的な問題があると考えています。tkinter イベント ループが原因である可能性があることは認識していますが、after_idle メソッドを使用すると、GUI がアイドル状態のときに Tkinter 以外のイベントを処理できるようになるという印象を受けました。まだ問題を引き起こしているのはtkinterイベントループですか、それとも何か他のものでしょうか?