Как вставить tkMessageBox в скрученный сервер
У меня есть сервер на основе витого реактора, и мне нужен следующий сценарий: сервер может получать два типа запросов
- ADD(x,y) и возвращает сумму
- HUMAN_PERMISSION, который возвращает true, только если пользователь-пользователь одобрил ip клиента
Я использую tkMessageBox, чтобы спросить пользователя, но проблема в том, что он блокирует весь реактор, а сервер перестает отвечать на другие запросы.
Я понимаю, что мне нужно каким-то образом использовать витую задержку, просто не знаю, как это: кажется, не работает, все равно блокирует весь реактор
d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)
1 ответ
Отложенные не могут ничего сделать, чтобы ваш код был неблокирующим. Все, что они могут сделать, это управлять цепочкой обратного вызова на основе существующего неблокирующего события. Это то, что позволяет переводить низкоуровневые события, такие как "было получено несколько байтов" или "соединение потеряно" или "пользователь нажал на кнопку", в события высокого уровня, такие как "ответ на 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
Это не самый популярный графический интерфейс в наши дни, вы можете найти некоторые проблемы, поэтому, пожалуйста, сообщите о них, если вы их найдете.