Как заставить tkinter отвечать на события во время ожидания данных сокета? - PullRequest
5 голосов
/ 28 июля 2010

Я пытаюсь заставить приложение читать данные из сокета, но это занимает некоторое время и блокирует интерфейс, как мне заставить его отвечать на события tk во время ожидания?

1 Ответ

9 голосов
/ 28 июля 2010

Это просто!И вам даже не нужны темы!Но вам придется немного реструктурировать свой код ввода-вывода.Tk имеет аналог вызова Xt XtAddInput (), который позволяет зарегистрировать функцию обратного вызова, которая будет вызываться из основной цепочки Tk, когда ввод / вывод возможен для файлового дескриптора.Вот что вам нужно:

from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)

Файл может быть файлом Python или объектом сокета (фактически, любым с методом fileno ()) или дескриптором целочисленного файла.Маска является одной из констант tkinter.READABLE или tkinter.WRITABLE.Обратный вызов вызывается следующим образом:

callback(file, mask)

Вы должны отменить регистрацию обратного вызова, когда закончите, используя

tkinter.deletefilehandler(file)

Примечание: поскольку вы не знаете, сколько байтов доступнодля чтения нельзя использовать методы чтения или чтения строки объекта Python, поскольку они будут настаивать на чтении заранее определенного числа байтов.Для сокетов методы recv () или recvfrom () будут работать нормально;для других файлов используйте os.read(file.fileno(), maxbytecount).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...