Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在等待套接字数据时使tkinter重新发送事件?_Python_Event Handling_Tkinter - Fatal编程技术网

Python 如何在等待套接字数据时使tkinter重新发送事件?

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文件或

我试图让应用程序从套接字读取数据,但这需要一些时间并锁定接口,如何让它在等待时响应tk事件?

这很简单!你甚至不需要线程!但您必须稍微重新构造I/O代码。Tk与Xt的XtAddInput()调用等效,它允许您注册一个回调函数,当文件描述符上可以进行I/O操作时,将从Tk mainloop调用该函数。以下是您需要的:

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发送套接字就绪通知