You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py 2.0中SelectMenu交互失败,请求排查原因

问题原因及修复方案

核心原因

  1. ctx.defer与ctx.send的错误搭配
    你调用ctx.defer(ephemeral=True)标记命令要延迟发送临时响应,但之后直接用ctx.send()发送消息——这会生成一条独立的公共消息,和defer创建的临时响应上下文冲突,导致绑定在这条消息上的SelectMenu交互无法被Discord正确识别,触发“交互失败”提示。

  2. 可选优化点(非直接失败原因)

    • 默认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:05:21