discord.py中discord.ui.Select交互超时后编辑消息报AttributeError如何解决
错误原因
discord.ui.View 实例本身不会自动绑定你发送的带视图的消息对象,所以你直接调用self.message的时候属性不存在,抛出AttributeError。
修复步骤
- 首先给
SearchMenuView新增初始化属性,预留消息存储位
修改你的SearchMenuView的__init__方法:
class SearchMenuView(discord.ui.View): def __init__(self, options, ctx, bot): super().__init__(timeout=60.0) self.ctx = ctx self.message = None # 新增这行,预留消息对象存储属性 self.add_item(SearchMenu(ctx, bot, options)) # 剩下的interaction_check、on_timeout原有代码不用修改
- 发送带视图的消息时,将返回的消息对象绑定到View实例上
你原来发送搜索菜单的逻辑大概是这样:
# 原发送代码示例 view = SearchMenuView(options=data, ctx=ctx, bot=bot) await ctx.send(embed=你的初始搜索结果embed, view=view)
修改为:
view = SearchMenuView(options=data, ctx=ctx, bot=bot) # 将发送后得到的消息对象赋值给view的message属性 view.message = await ctx.send(embed=你的初始搜索结果embed, view=view)
如果你的菜单是通过斜杠命令/交互响应发送,不是ctx.send触发的,用下面的方式拿消息对象:
# 交互响应场景示例 await interaction.response.send_message(embed=你的初始搜索结果embed, view=view) view.message = await interaction.original_response()
- 可选:增加异常捕获,避免消息被提前删除时报错
可以给on_timeout方法加异常捕获,提升鲁棒性:
async def on_timeout(self): embed = Embed(emoji=self.ctx.emoji.whitecross, description="Interaction has timed out. Please try again.") try: await self.message.edit(embed=embed, view=None) except discord.NotFound: # 消息已经被提前删除,直接跳过操作即可 pass
修改完成后超时逻辑就可以正常编辑原交互消息了。
内容的提问来源于stack exchange,提问作者Alado
相关产品推荐
相关产品推荐

