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

discord.py中discord.ui.Select交互超时后编辑消息报AttributeError如何解决

错误原因

discord.ui.View 实例本身不会自动绑定你发送的带视图的消息对象,所以你直接调用self.message的时候属性不存在,抛出AttributeError。

修复步骤

  1. 首先给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原有代码不用修改
  1. 发送带视图的消息时,将返回的消息对象绑定到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()
  1. 可选:增加异常捕获,避免消息被提前删除时报错
    可以给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:54:04