在这一点上,当谈到 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 事件循环还是其他原因?