我目前正在做一个利用Telegram bot的新项目。然而,我是Telegram机器人的新手,我正在努力学习新东西。该项目包括创建一个多级列表,其中显示执行特定功能的按钮。然而,每个关卡都有一个后退按钮,返回一步。
当前菜单如下:
主菜单有三个按钮:1-随机数2-随机字符串3-其他
其他菜单有三个按钮:1-信息2-汇率3-主菜单
信息菜单有一个按钮:1-返回
随机字符串菜单有一个按钮:1-返回
现在我设法从信息菜单返回一步返回其他菜单使用下面的代码;然而,我不能做同样的事情与随机字符串菜单因为一旦我按下后退键,将带我回到其他菜单而不是主菜单,很可能是因为在markup .py文件中重复的KeyboardButton(' Back'),导致导航到现有的菜单之一(其他菜单)。) .
你知道如何克服这个问题吗?
# main.py
import logging
from aiogram import Bot, Dispatcher, executor, types
import markups as nav
import random
TOKEN = ''
# logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def command_start(message: types.Message):
await bot.send_message(message.from_user.id, f'Hello {message.from_user.first_name}', reply_markup = nav.mainMenu)
@dp.message_handler()
async def bot_message(message: types.Message):
# await bot.send_message(message.from_user.id, message.text)
if message.text == '♦ Random Number':
await bot.send_message(message.from_user.id, "" + str(random.randint(1000,9999)))
elif message.text == '🍕 Random String':
await bot.send_message(message.from_user.id, '🍕 Random String', reply_markup = nav.subFoodMenu)
elif message.text == '⬅ Main Menu':
await bot.send_message(message.from_user.id, "⬅ Main Menu", reply_markup = nav.mainMenu)
elif message.text == '➡ Other':
await bot.send_message(message.from_user.id, "➡ Other", reply_markup = nav.otherMenu)
elif message.text == '⬅ Back':
await bot.send_message(message.from_user.id, '⬅ Back', reply_markup = nav.otherMenu)
elif message.text == '📚 Information':
await bot.send_message(message.from_user.id, "📚 Information", reply_markup = nav.subOtherMenu)
elif message.text == '📈 Exchange Rate':
await bot.send_message(message.from_user.id, "📈 Exchange Rate")
else:
await message.reply('No data')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates = True)
# markups.py
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
btnMain = KeyboardButton('⬅ Main Menu')
btnOtherMain = KeyboardButton('⬅ Back')
btnFoodMain = KeyboardButton('⬅ Back')
# Main Menu :
btnRandom = KeyboardButton('♦ Random Number')
btnFood = KeyboardButton('🍕 Random String')
btnOther = KeyboardButton('➡ Other')
mainMenu = ReplyKeyboardMarkup(resize_keyboard = True).add(btnRandom, btnFood, btnOther)
# Other Menu :
btnInfo = KeyboardButton('📚 Information')
btnMoney = KeyboardButton('📈 Exchange Rate')
otherMenu = ReplyKeyboardMarkup(resize_keyboard = True).add(btnInfo, btnMoney, btnMain)
# Sub Other Menu:
subOtherMenu = ReplyKeyboardMarkup(resize_keyboard = True).add(btnOtherMain)
# Food Menu:
subFoodMenu = ReplyKeyboardMarkup(resize_keyboard = True).add(btnFoodMain)
答案
在这种情况下应该使用FSM。这样,相同的文本命令可以路由到不同的操作和级别
还- 不要连接字符串,使用f-strings代替。
- 对不同的文本使用不同的处理程序:
@dp.message_handler(text="🍕 Random String")
async def handler_random_string(message: types.Message):
...
- 使用快捷方式代替完整的bot方法。这将使你的代码更干净,更易读。
await message.answer("Hello world")