Как вставить tkMessageBox в скрученный сервер - PullRequest
1 голос
/ 22 апреля 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 22 апреля 2011

Отложенные не могут ничего сделать, чтобы ваш код был неблокирующим. Все, что они могут сделать, это управлять цепочкой обратного вызова на основе существующего неблокирующего события. Это то, что позволяет переводить низкоуровневые события, такие как «было получено несколько байтов» или «соединение потеряно» или «пользователь нажал на кнопку», в события высокого уровня, такие как «ответ на 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 не является самым популярным графическим интерфейсом в наши дни, вы можете обнаружить некоторые проблемы, поэтому, пожалуйста, сообщите о них , если обнаружите.

...