Как использовать вторую интерактивную доску в боте Telegram?

#python #telegram #telegram-bot #python-telegram-bot

Вопрос:

Я могу прекрасно использовать каждую кнопку с первой линейной панели(self._morebuttons1), и я могу открыть вторую линейную панель(self._morebuttons2) с первой, но ни одна кнопка не работает на второй линейной панели, вероятно, из-за обратного вызова данных. Я пытался вернуться к началу функции, но всегда получал ошибку NameError: name '_morebuttons1' is not defined .

Как можно использовать две или более интерактивных панелей?

Пример моего кода:

         handles = [
            CommandHandler('One', self._one),
            CommandHandler('morebuttons2', self._morebuttons2),
            CommandHandler('Three', self._three),
            CommandHandler('morebuttons1', self._morebuttons1),
        ]
        callbacks = [
            CallbackQueryHandler(self._morebuttons1_inline),
            CallbackQueryHandler(self._morebuttons2_inline),

    def _morebuttons1(self, update: Update, context: CallbackContext) -> None:

        keyb = [[InlineKeyboardButton('One', callback_data='1')],
        [InlineKeyboardButton('To the second inlinekeyboard', callback_data='2')]]
        menu_choices = InlineKeyboardMarkup(keyb)
        update.message.reply_text("start with commands 1", reply_markup=menu_choices)
        
        for handle in handles:
            self._updater.dispatcher.add_handler(handle)

        for callback in callbacks:
            self._updater.dispatcher.add_handler(callback)


    def _morebuttons_inline(self, update: Update, context: CallbackContext) -> None:   
        
        if update.callback_query:
           
           msg = update.callback_query

           
           if msg.data == '1':
            self._one(update, context),
            
           if msg.data == '2':
            self._morebuttons2(update, context)
            
            
            
        return _morebuttons1
           
            
    def _morebuttons2(self, update: Update, context: CallbackContext) -> None:

        keyb = [[InlineKeyboardButton('Three', callback_data='3')],
        [InlineKeyboardButton('Back to the first inlinekeyboard', callback_data='4')]]
        menu_choices = InlineKeyboardMarkup(keyb)
        update.callback_query.message.edit_text("start with commands 2", reply_markup=menu_choices)             
            
            
    def _morebuttons2_inline(self, update: Update, context: CallbackContext) -> None:   
        if update.callback_query:
           msg = update.callback_query
           
           
           if msg.data == '3':
            self._three(update, context),
            
           if msg.data == '4':
            self._morebuttons1(update, context) 
           
        return _morebuttons2
 

Полная обратная связь:

 Traceback (most recent call last):
  File "/home/jamreg/TelegramBotTest/glc/tg1.py", line 69, in wrapper
    return command_handler(self, *args, **kwargs)
  File "/home/jamreg/TelegramBotTest/glc/tg1.py", line 1058, in _morebuttons1_inline
    return _morebuttons1
NameError: name '_morebuttons1' is not defined
 

Спасибо! 🙂

Комментарии:

1. Можете ли вы показать полную обратную связь? Также было бы полезно увидеть выполняемые примеры, а не только обратные вызовы …

2. Я добавил полную обратную трассировку в код от командных команд до линейных панелей. 🙂 @CallMeStag

3. Я не вижу обратной связи. Обратная связь-это большой текстовый блог, который печатается при возникновении исключения. Это говорит вам, где это произошло. Для получения кода: Пожалуйста, прочитайте telegra.ph/Minimal-Working-Example-for-PTB-07-18

4. я добавил обратную трассировку

5. Ах. Мне, наверное, следовало бы быть return self._morebuttons1 вместо return _morebuttons1 этого . Но я не могу сказать наверняка без MWE.

Ответ №1:

Я нашел решение. Просто объедините все данные из self._morebuttons_inline и self._morebuttons2_inline вместе. Спасибо @CallMeStag за помощь 🙂