gpt4 book ai didi

python - 管理多级菜单中的后退按钮 - Telegram Bot (Python)

转载 作者:行者123 更新时间:2023-12-05 05:54:09 24 4
gpt4 key购买 nike

我目前正在开发一个使用 Telegram 机器人的新项目。然而,我是 Telegram 机器人的新手,我正在努力学习新事物。该项目包括创建一个多级列表,其中显示执行特定功能的按钮。但是,每个级别都有一个后退按钮,可以向后退一步。

目前的菜单如下:

主菜单具有三个按钮:1- 随机数 2- 随机字符串 3- 其他

其他菜单有三个按钮:1- 信息 2- 汇率 3- 主菜单<​​/p>

信息菜单只有一个按钮:1- 返回

Random String Menu 有一个按钮:1- Back

现在我设法使用下面的代码从信息菜单返回到其他菜单;但是,我无法对 Random String Menu 做同样的事情,因为一旦我按下后退按钮,我就会回到 Other Menu 而不是 Main菜单,很可能是因为 markups.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对于那种情况。这样,相同的文本命令可能会被路由到不同的操作和级别

还有

  1. 不要连接字符串,使用 f-strings相反。
  2. 对不同的文本使用不同的处理程序:
@dp.message_handler(text="🍕 Random String")
async def handler_random_string(message: types.Message):
...
  1. 使用快捷方式而不是完整的机器人方法。这将使您的代码更清晰、更易读。
await message.answer("Hello world")

关于python - 管理多级菜单中的后退按钮 - Telegram Bot (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69700889/

24 4 0