Отложенные не могут ничего сделать, чтобы ваш код был неблокирующим. Все, что они могут сделать, это управлять цепочкой обратного вызова на основе существующего неблокирующего события. Это то, что позволяет переводить низкоуровневые события, такие как «было получено несколько байтов» или «соединение потеряно» или «пользователь нажал на кнопку», в события высокого уровня, такие как «ответ на HTTP-запрос» или «пользователь ответил ваш вопрос". deferLater
, например, просто запускает свой Deferred
по прошествии некоторого времени.
Вам даже не нужен реактор, чтобы использовать Deferred
. Например:
>>> from twisted.internet.defer import Deferred
>>> d = Deferred()
>>> def transformResult(result):
... return result + 5
...
>>> d.addCallback(transformResult)
<Deferred at 0x100521200>
>>> def itsDone(result):
... print("It's done: " + str(result))
...
>>> d.addCallback(itsDone)
<Deferred at 0x100521200>
>>> d.callback(3)
It's done: 8
>>>
Вы можете позвонить callback()
из любой точки мира; это просто обычно , вызываемый с события реактора. В вашем случае вы, вероятно, захотите вызвать callback
из события Tk
.
Все это говорит о том, что вам нужен способ для передачи событий Tk
в главный поток реактора, что вы делаете, используя реактор, который знает о главном цикле Tk
. Комментатор уже упоминал, что для этого существует API: twisted.internet.tksupport
. Учитывая, что Tk
не является самым популярным графическим интерфейсом в наши дни, вы можете обнаружить некоторые проблемы, поэтому, пожалуйста, сообщите о них , если обнаружите.