Как вытолкнуть tkMessageBox на скрученный сервер

У меня сервер на основе витого реактора, и мне нужен следующий сценарий: сервер может принимать два типа запроса

  • ADD(x,y) и возвращает сумму
  • HUMAN_PERMISSION, который возвращает true, только если пользователь-человек одобрил IP-адрес клиента.

Я использую tkMessageBox, чтобы спросить пользователя-человека, но проблема в том, что он блокирует весь реактор, и сервер перестает отвечать на другие запросы.

Я понимаю, что я должен каким-то образом использовать отсроченный скрученный здесь, просто не знаю, как это: похоже, не работает, он все равно блокирует весь реактор

d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)

person koyaya    schedule 21.04.2011    source источник
comment
Вы выполнили tksupport.install(tkinstance)?   -  person PEdroArthur    schedule 22.04.2011


Ответы (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 в основной поток реактора, что вы делаете, используя реактор, который знает о mainloop Tk. Комментатор уже упомянул, что для этого существует API: twisted.internet.tksupport. Учитывая, что Tk не самый популярный графический интерфейс в наши дни, вы можете столкнуться с некоторыми проблемами, поэтому сообщите о них, если вы найдете любую.

person Glyph    schedule 21.04.2011