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

Discord机器人开发报错:'Select' object has no attribute 'get'

报错根因

触发AttributeError: 'Select' object has no attribute 'get'的核心原因是组件传参不符合discord_slash库的规则,同时交互监听逻辑还有一处写法错误:

  • discord_slash规定所有消息交互组件(选择菜单、按钮)必须先包裹在ActionRow(动作行,即Discord接口定义的type=1类型组件容器)中,才能传入ctx.send()的components列表。你直接裸传Select实例,库遍历组件时默认要读取ActionRow的属性,自然找不到get方法抛错。
  • 交互监听的校验逻辑写错:inter.custom_id == topselect里的topselect是你定义的异步函数对象,不是你设置的自定义ID字符串'topselect',会导致用户选择后校验永远无法匹配。
修复方案
  • 从库中导入create_actionrow方法,用来生成组件容器
  • 把Select实例放入create_actionrow生成的动作行容器后,再传入components参数
  • 修正wait_for的校验逻辑,把custom_id匹配值改为字符串格式
  • 调整交互响应写法,避免触发交互未响应报错
可直接运行的修复后代码
# 确保已导入所需组件类
from discord_slash.utils.manage_components import create_actionrow, Select, SelectOption

async def topselect(ctx):
    # 实例化选择菜单
    select_menu = Select(
        placeholder='Select',
        options=[
            SelectOption(label='Option 1', value='1')
        ],
        custom_id='topselect'
    )
    # 将选择菜单包裹进ActionRow容器后再传入components
    top_msg = await ctx.send(embed=top_embed, components=[create_actionrow(select_menu)])

    # 修正校验逻辑
    def select_check(inter):
        return inter.custom_id == 'topselect' and inter.user == ctx.author

    # 监听用户选择操作
    interaction = await client.wait_for('select_option', check=select_check)
    # 返回用户选择的选项值
    await interaction.send(f"你选中的选项值为:{interaction.values[0]}")
补充说明
  • 单个ActionRow容器最多可放置1个选择菜单,或最多5个按钮,符合Discord官方的消息组件规范
  • 如果需要添加多个选择菜单/按钮,每个组件单独放在一个ActionRow中,再将多个ActionRow放入components列表即可
  • 可给wait_for添加timeout=xxx参数(单位为秒),避免长时间无操作占用资源

内容的提问来源于stack exchange,提问作者mek0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 13:27:25