не нажимается inline кнопка telebot
import telebot
from telebot import types
from text_ln import messages
from function import functions
from kb import kb
import sqlite3
bot = telebot.TeleBot('token')
@bot.message_handler(commands=['start'])
def start(message):
functions.first(user_id=message.chat.id)
bot.send_message(message.chat.id, 'choose language', reply_markup=kb.start)
@bot.callback_query_handler(func=lambda call: call.data == 'ru' or 'en')
def language(call):
if call.data == "ru":
language1 = 'ru'
db = sqlite3.connect('language.db')
cursor = db.cursor()
q = cursor.execute(f"UPDATE user SET language = ? WHERE user_id = ?",(language1,call.message.chat.id))
db.commit()
db.close()
start_2(call)
bot.delete_message(call.message.chat.id, call.message.message_id)
elif call.data == "en":
language1 = 'en'
db = sqlite3.connect('language.db')
cursor = db.cursor()
q = cursor.execute(f"UPDATE user SET language = ? WHERE user_id = ?",(language1,call.message.chat.id))
db.commit()
db.close()
start_2(call)
bot.delete_message(call.message.chat.id, call.message.message_id)
def start_2(call):
language = functions.ln(user_id=call.message.chat.id)
name = bot.send_message(call.message.chat.id, messages.name[f'name_{language}'])
bot.register_next_step_handler(name, start_3)
def start_3(call):
language = functions.ln(user_id=call.from_user.id)
functions.name(user_id=call.from_user.id,name=call.text)
name_1 = {'name_1_ru':f'Вас зовут верно {call.text}?', 'name_1_en':f'Your name is {call.text} rigth ?'}
name = types.InlineKeyboardMarkup(row_width=2)
item1 = types.InlineKeyboardButton(text = messages.name_2_r[f'name_2_{language}'], callback_data = 'right')
item2 = types.InlineKeyboardButton(text = messages.name_2_w[f'name_2_{language}'], callback_data = 'wrong')
name.add(item1,item2)
bot.send_message(call.from_user.id, name_1[f'name_1_{language}'],reply_markup=name)
@bot.callback_query_handler(func=lambda call: call.data == 'right' or 'wrong')
def name(call):
if call.data == 'right':
video = open("/home/roman/Desktop/urist/photo/Видео 1.mp4", "rb")
bot.send_video(call.message.chat.id,video, caption=f"""
Добрый день, {functions.select_name(user_id=call.from_user.id)} ?
""")
elif call.data == 'wrong':
start_2(call)
bot.polling()
После нажатия на кнопки ru или en все срабатывает, дальше кнопки right или wrong не срабатывают, если все помещаю в один хендлер, работает, если пишу в таком формате, 2 хендлер отваливается
Ответы (2 шт):
Автор решения: biflé
→ Ссылка
Я бы рекомендовал сделать так:
- Создаем кнопки, callback делаем с префиксом (lang_ru/lang_en, vote_right/vote_wrong)
- Создаем хендлеры, в них прописываем фильтр - pattern='^{префикс}'
- Получаем данные (убираем префикс у callback)
Как это выглядит в коде:
@bot.callback_query_handler(pattern='^lang')
def language(call):
language=call.data.split('_')[1] #получаем ru/en
db = sqlite3.connect('language.db')
cursor = db.cursor()
cursor.execute(
"UPDATE user SET language = ? WHERE user_id = ?",
(language, call.message.chat.id))
db.commit()
db.close()
start_2(call)
bot.delete_message(call.message.chat.id, call.message.message_id)
Совет: бд и курсор определяем в начале кода, чтобы не подключаться каждый раз. Так нам останется только делать .commit() каждый раз, а не подключаться-отключаться и т.д.
Автор решения: oleksandrigo
→ Ссылка
Вы неправильно прописали условие. Делайте так
@bot.callback_query_handler(func=lambda call: call.data in ('ru', 'en'))