如何在Discord Cogs中构建选择菜单?交互失败问题求助
问题分析与解决办法
你的代码存在两个核心问题,直接导致了"Interaction failed"提示:
1. 回调函数语法错误(缩进问题)
select_callback函数内部的代码没有缩进,这会触发语法错误,机器人处理交互时会抛出异常,无法正常响应请求。
2. 数据类型不匹配
你给选项设置的value是整数类型(1、2、3),但回调函数里判断的是字符串类型('1'、'2'、'3'),条件永远无法成立,因此没有发送任何响应给Discord,平台等待超时后就会判定交互失败。
修正后的代码
import discord from discord.ext import commands from discord import app_commands async def select_callback(interaction: discord.Interaction): # 修复缩进问题 result = interaction.data.get('values') result = result[0] print(result) # 统一数据类型,改为判断整数 if result == 1: await interaction.response.send_message("success1") elif result == 2: await interaction.response.send_message('success2') elif result == 3: await interaction.response.send_message("success3") class aButton(commands.Cog): def __init__(self, bot): self.bot = bot @app_commands.command(name = "view_base", description = "Simple View Example") async def view_base(self, interaction: discord.Interaction): view = discord.ui.View() select1 = discord.ui.Select() select1.add_option(label="A", value = 1, description="Explain a") select1.add_option(label="B", value = 2, description="Explain B") select1.add_option(label="C", value = 3, description="Explain C") select1.callback = select_callback view.add_item(select1) await interaction.response.send_message(view = view) async def setup(bot): await bot.add_cog(aButton(bot))
更规范的写法(推荐)
使用类继承定义Select组件,避免直接赋值callback的潜在作用域问题,代码也更易维护:
import discord from discord.ext import commands from discord import app_commands class MySelect(discord.ui.Select): def __init__(self): options = [ discord.SelectOption(label="A", value=1, description="Explain a"), discord.SelectOption(label="B", value=2, description="Explain B"), discord.SelectOption(label="C", value=3, description="Explain C") ] super().__init__(options=options) async def callback(self, interaction: discord.Interaction): result = self.values[0] print(result) if result == 1: await interaction.response.send_message("success1") elif result == 2: await interaction.response.send_message('success2') elif result == 3: await interaction.response.send_message("success3") class MyView(discord.ui.View): def __init__(self): super().__init__() self.add_item(MySelect()) class aButton(commands.Cog): def __init__(self, bot): self.bot = bot @app_commands.command(name = "view_base", description = "Simple View Example") async def view_base(self, interaction: discord.Interaction): await interaction.response.send_message(view=MyView()) async def setup(bot): await bot.add_cog(aButton(bot))
内容的提问来源于stack exchange,提问作者user_Kaito
相关产品推荐
相关产品推荐

