Python: ожидание пользовательского ввода или обратного вызова, в зависимости от того, что произойдет раньше - PullRequest
0 голосов
/ 01 марта 2019

У меня есть чат-бот, который ожидает ввода пользователя, но также имеет экран, на котором пользователи могут нажать кнопку, чтобы выбрать опцию.В моем коде Python я могу получить выбранную опцию через обратный вызов, и у меня также есть бесконечный цикл, который ожидает ввода данных пользователем после ответа чат-бота.Я хочу задать вопрос пользователю, но разрешить ему либо ввести ответ, либо выбрать вариант на экране.Поэтому я хочу что-то более или менее похожее на это:

inp = ""
while(True):
    answer, end = get_answer(inp)
    print('CHATBOT: '+ answer)
    if end = break
    if input by user:
         inp = input by user
    elif callback:
         inp = callback value

Конечно, callbak или ввод от пользователя может занять некоторое время, поэтому таймер является нежелательным.Как я мог это сделать?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать потоки с очередью сообщений:

from threading import Thread
from Queue import Queue
from datetime import datetime
import time

def chatbot(queue):
    while True:
        queue.put('CHATBOT: The time is now %s' % datetime.now())
        time.sleep(5)

def user_input(queue):
    while True:
        queue.put('USER: ' + raw_input())

queue = Queue()
chatbot_thread = Thread(target=chatbot, args=(queue,))
input_thread = Thread(target=user_input, args=(queue,))
chatbot_thread.start()
input_thread.start()
while True:
    print(queue.get())

Пример ввода / вывода:

CHATBOT: The time is now 2019-03-01 07:42:43.975000
hello world
USER: hello world
CHATBOT: The time is now 2019-03-01 07:42:48.976000
CHATBOT: The time is now 2019-03-01 07:42:53.977000
foo bar
USER: foo bar
CHATBOT: The time is now 2019-03-01 07:42:58.977000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...