Discord.py 2.0中SelectMenu交互失败,请求排查原因
问题原因及修复方案
核心原因
ctx.defer与ctx.send的错误搭配
你调用ctx.defer(ephemeral=True)标记命令要延迟发送临时响应,但之后直接用ctx.send()发送消息——这会生成一条独立的公共消息,和defer创建的临时响应上下文冲突,导致绑定在这条消息上的SelectMenu交互无法被Discord正确识别,触发“交互失败”提示。可选优化点(非直接失败原因)
- 默认
View的超时时间为180秒,超过后菜单会失效,若需要长期可用,需初始化View时指定timeout=None。 - 回调里用
select.values[0]依赖外部变量,更稳妥的方式是直接从interaction.values[0]获取选中值。
- 默认
修复后的代码
from discord.ui import Select, View @commands.command(name='select_menu') async def select_menu(self, ctx): select = Select( placeholder='Choose an action...', options=[ discord.SelectOption( label='Option 1', value='1', description='First action' ), discord.SelectOption( label='Option 2', value='2', description='Second action' ), discord.SelectOption( label='Option 3', value='3', description='Third action' ) ] ) async def my_callback(interaction: discord.Interaction): selected_value = interaction.values[0] # 保持回复为临时消息,和原消息属性一致 await interaction.response.reply(f'You chose {selected_value}', ephemeral=True) select.callback = my_callback # 如需长期可用,改为View(timeout=None) view = View() view.add_item(select) # 方案1:直接发送临时消息(无需defer) await ctx.send('Select menu', view=view, ephemeral=True) # 方案2:若需处理耗时操作,用defer+followup # await ctx.defer(ephemeral=True) # await ctx.followup.send('Select menu', view=view)
内容的提问来源于stack exchange,提问作者Bohdan
相关产品推荐
相关产品推荐

