Python 如何在等待套接字数据时使tkinter重新发送事件?
我试图让应用程序从套接字读取数据,但这需要一些时间并锁定接口,如何让它在等待时响应tk事件?这很简单!你甚至不需要线程!但您必须稍微重新构造I/O代码。Tk与Xt的XtAddInput()调用等效,它允许您注册一个回调函数,当文件描述符上可以进行I/O操作时,将从Tk mainloop调用该函数。以下是您需要的:Python 如何在等待套接字数据时使tkinter重新发送事件?,python,event-handling,tkinter,Python,Event Handling,Tkinter,我试图让应用程序从套接字读取数据,但这需要一些时间并锁定接口,如何让它在等待时响应tk事件?这很简单!你甚至不需要线程!但您必须稍微重新构造I/O代码。Tk与Xt的XtAddInput()调用等效,它允许您注册一个回调函数,当文件描述符上可以进行I/O操作时,将从Tk mainloop调用该函数。以下是您需要的: from Tkinter import tkinter tkinter.createfilehandler(file, mask, callback) 该文件可以是Python文件或
from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)
该文件可以是Python文件或套接字对象(实际上是任何具有fileno()方法的对象),也可以是整数文件描述符。掩码是常数tkinter.READABLE或tkinter.WRITABLE之一。回调调用如下所示:
callback(file, mask)
完成后,必须使用取消注册回调
tkinter.deletefilehandler(file)
注意:由于您不知道有多少字节可供读取,因此不能使用Python文件对象的read或readline方法,因为这些方法将坚持读取预定义的字节数。对于套接字,recv()或recvfrom()方法可以正常工作;对于其他文件,请使用
os.read(file.fileno(),maxbytecount)。
这是Tk非常非常好的功能之一——在可以读取文件时获取事件使套接字处理非常容易。这在Windows上似乎不起作用,即使Windows有WSAAsyncSelect()
它准确地向GUI发送套接字就绪通知