【问题标题】:How to make tkinter repond events while waiting socket data?如何在等待套接字数据时使 tkinter 响应事件?
【发布时间】:2010-07-27 23:21:23
【问题描述】:

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

【问题讨论】:

    标签: python event-handling tkinter


    【解决方案1】:

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

    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
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多