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
相关产品推荐
相关产品推荐

