Что за ерунда у тебя в коде творится? Поучи азы Питона сначала, потом уже бросайся помощников писать...
say_message("Здравствуйте, хозяин!" and "Рад снова вас видеть!")
Как по твоему, что вот этот and должен значить? На самом деле, у тебя ВСЕГДА будет произноситься только второе выражение. and - это логический оператор в первую очередь. Его поведение для не-логических значений весьма специфическое.
say_message("Как пожелаете"+str(right_mouse_control()))
Оставляя за кадром вопрос "зачем", что возвращает функция right_mouse_control()? Она должна возвращать какой-то текст для произношения? Если должна, она явно этого не делает. Если не должна, то зачем ты засовываешь её возвращаемое значение в строку? Почему просто её не вызвать, вне рамок say_message()?
То же самое для остальных вариантов ниже.
Ну и простыня elif как вишенка на торте, да.
EDIT: покажу, как можно это улучшить. Код сложный, но зато легко расширяется.
Сделаем класс, который будет рулить списком известных команд и сопоставленными им фразами.
Чтобы не пришлось повторяться, сделаем так, чтобы для добавления новой команды достаточно было
написать функцию и задекорировать её. Пример будет ниже.
class VoiceCommandList: #класс управляет списком голосовых команд
def __init__(self):
self.actions = list() #список известных классу команд
def on(self, condition): #декоратор, подписывает функцию на голосовую команду
if isinstance(condition, str):
condition = condition.lower()
predicate = lambda text: condition in text #если условие - строка, она должна входить в текст
elif callable(condition):
predicate = condition #если условие - функция, она должна вернуть истину для текста
else: #ни то ни другое - ошибка
raise TypeError('Condition must be either string or function!')
#эта функция - декоратор, она будет помечать функции-команды.
#она описана именно внутри метода on()!
def decorator(command_func):
self.actions.append( (predicate, command_func) )
return command_func
return decorator
def run_command(self, text): #функция получает строку, определяет и вызывает соотв. её команду
text = text.lower()
for predicate, command in self.actions:
if predicate(text): #текст соответствует известной команде
try:
response = command(text) #пытаемся выполнить команду
if response is None: #если команда не сообщила нам, что ответить
response = "Команда выполнена"
except Exception as err: #не получилось
response = "Ошибка при выполнении команды"
print(err)
if response: #если есть какой-то ответ
say_message(response) #то произносим его
break #выполняем не более одной команды за раз
else: #этот else относится к for, не к if! Если не нашли ни одной похожей команды
say_message("Неизвестная команда")
А теперь примеры использования класса. Мы можем добавлять команды, описав функции. Нет нужды править длинную простыню if-elif-else
vcl = VoiceCommandList() #экземпляр списка команд
#опишем реакцию на простую строку типа "привет".
@vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
return "Доброе время суток" #она должна вернуть текст, который скажет бот
@vcl.on('открой оперу')
def start_opera(text):
operaopen() #выполняем действие
return "Браузер запущен" #возвращаем текст ответа
@vcl.on('напиши')
def write_message(text):
print(text)
#если ничего не вернём, будет отклик по умолчанию
@vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
def what(text):
return "Так влево или вправо?"
Ну а чтобы скормить боту распознанную строку:
vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи