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)
- Original language
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.