Home python Many Layer Menu ReplyKeyboardMarkup

Many Layer Menu ReplyKeyboardMarkup

Author

Date

Category

Hello everyone began to study the creation of a bot on python using pytelegrambotapi

I can not figure out how to use ReplyKeyboardMarkup make a multi-level menu.
By type

  • menu
    • Original language
      • English
      • Russian
      • Other language
      • Other language
      • back (go to the menu)
    • translation language
      • English
      • Russian
      • Other language
      • Other language
      • back (go to the menu)
    • back (go to the menu)

But as I can not figure out how to make such a multi-level menu, how to correctly track the press so that other messages do not prevent the selection process in the menu.

Some I am looking for I can not find a normal tutorial nor an example, all in examples use inlinekeyboardmarkup and pay more attention to it than replykeyboardmarkup

On the first screen, what I got to do.
On the second, as I would like to do.

I would be grateful if someone explains how to do it normally.

Source code for my bot

import config
Import Telebot.
Import Translate.
From Telebot Import Types
BOT = TELEBOT.TELEBOT (config.Token)
Source_Language = 'Russian'
Target_language = 'English'
@ Bot.Message_Handler (Commands = ['Start'])
Def First (Message):
  Keyboard = Types.ReplyKeyboardMarkup (True, False)
  Keyboard.add ('Menu')
  send = Bot.Send_Message (Message.chat.id, 'Hello! I am a translator! \ n I know enough languages ​​\ n Just write the text in English or Russian or click' Menu 'below to change the language or select the mode of operation.', Reply_MarkUp = Keyboard)
  Bot.register_next_Step_Handler (Send, Second)
DEF SECOND (Message):
  If Message.Text == 'Menu':
    Keyboard = Types.ReplyKeyboardMarkup (True, False)
    Keyboard.row ('Original Language', 'Translation Language')
    Keyboard.add ('Cancel')
    send = Bot.Send_Message (Message.chat.id, 'Choose', Reply_MarkUp = Keyboard)
    Bot.register_next_Step_Handler (Send, Third)
  ELSE:
    Bot.Send_Message (Message.chat.id, 'Mesyan did not understand')
Def Third (Message):
  If Message.text == 'Original Language':
    Keyboard = Types.ReplyKeyboardMarkup (True, False)
    Keyboard.row ('English', 'Russian')
    Keyboard.add ('Cancel')
    send = Bot.Send_Message (Message.chat.id, 'Choose Language', Reply_MarkUp = Keyboard)
    Bot.register_next_Step_Handler (Send, Select_source_Language)
  Elif Message.Text == 'Translation language':
    Keyboard = Types.ReplyKeyboardMarkup (True, False)
    Keyboard.ROW ('Russian', 'English')
    Keyboard.add ('Cancel')
    send = Bot.Send_Message (Message.chat.id, 'Choose Language', Reply_MarkUp = Keyboard)
    Bot.register_next_Step_Handler (Send, Select_Target_Language)
  ELIF Message.Text == 'Cancel':
    FIRST (Message)
  ELSE:
    Bot.Send_Message (Message.chat.id, 'Mesyan did not understand')
DEF Setsourcelanguage (Message):
  Global Source_Language.
  Source_Language = Message.Text
  Bot.send_Message (Message.chat.ID, 'S: {} - & gt; t: {}'. Format (Source_Language, Target_Language)))
  FIRST (Message)
DEF SetTargetLanguage (Message):
  Global Target_Language.
  Target_Language = Message.Text
  Bot.send_Message (Message.chat.ID, 'S: {} - & gt; t: {}'. Format (Source_Language, Target_Language)))
  FIRST (Message)
DEF SELECT_SOURCE_LANGUAGE (Message):
  If Message.Text == 'English':
    SetSourcelanguage (Message)
  Elif Message.Text == 'Russian':
    SetSourcelanguage (Message)
  ELIF Message.Text == 'Cancel':
    FIRST (Message)
  ELSE:
    Bot.Send_Message (Message.chat.id, 'Mesyan did not understand')
DEF SELECT_TARGET_LANGUAGE (Message):
  If Message.Text == 'English': 
SetTargetLanguage (Message)
  Elif Message.Text == 'Russian':
    SetTargetLanguage (Message)
  ELIF Message.Text == 'Cancel':
    FIRST (Message)
  ELSE:
    Bot.Send_Message (Message.chat.id, 'Mesyan did not understand')
@ Bot.Message_Handler (CONTENT_TYPES = ["TEXT"])
DEF SEND_MESSAGES (Message): # The name of the function does not play any role, in principle
  Bot.Send_Message (Message.chat.id, 'This is a reaction to the text')
if __name__ == '__main__':
  Bot.infinity_polling ()

Answer 1, Authority 100%

Because ReplyKeyboardMarkUp is a text message workpiece that is sent to the chat, you need to handle all such messages using Bot.Message_Handler (CONTENT_TYPES = ["Text"])

For example:

@ bot.message_handler (Commands = ['Start'])
Def Menu (Message):
  Start_Menu = Types.ReplyKeyboardMarkup (True, True)
  start_menu.row ('Original Language', 'Translation Language')
  Bot.Send_Message (Message.chat.ID, 'Start Menu', Reply_Markup = Start_Menu)
@ Bot.Message_Handler (Content_Types = ['Text'])
DEF HANDLE_TEXT (Message):
  If Message.text == 'Original Language':
    Source_Language_Menu = Types.ReplyKeyboardMarkup (True, True)
    Source_Language_Menu.ROW ('English', 'Russian')
    Source_Language_Menu.ROW ('Other', 'Other 1')
    Source_Language_Menu.row ('Back')
    Bot.Send_Message (Message.chat.id, 'Original Language - Menu', Reply_MarkUp = Source_Language_Menu)
  Elif Message.Text == 'Translation language':
    Translation_Language_Menu = Types.ReplyKeyboardMarkup (True, True)
    translation_language_menu.row ( 'English', 'Russian')
    translation_language_menu.row ('Other', 'Other 1')
    translation_language_menu.row ( 'Back')
    bot.send_message (message.chat.id, 'Translation Language - Menu', reply_markup = translation_language_menu)
  elif message.text == 'Back':
    menu (message)

but if I’m not right, interpreted your question, you can specify in the comments what it is the complexity.

Programmers, Start Your Engines!

Why spend time searching for the correct question and then entering your answer when you can find it in a second? That's what CompuTicket is all about! Here you'll find thousands of questions and answers from hundreds of computer languages.

Recent questions