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

Disnake按钮无响应:回调函数未执行且无报错求助

问题分析与修复方案

核心问题1:参数类型不匹配导致回调执行失败

你的QueryButton类__init__方法中,choice参数定义为int类型,但创建按钮时传入的是str(i)。后续在回调中执行self.choice-1时,字符串无法与整数相减,直接抛出异常,导致Discord返回"This Interaction Failed",且因为没有异常捕获,你看不到错误信息。

修复:创建按钮时传入整数类型的i:

buttons = [QueryButton(choice=i, user_id=user_id, label=str(i), style=disnake.ButtonStyle.green, custom_id=f"query_btn_{user_id}_{i}") for i in range(1, len(queries)+1)]

核心问题2:组件未正确包装为ActionRow

Disnake要求所有交互组件(如按钮)必须放在ActionRow容器中,否则框架无法正确识别并绑定回调函数。你直接将按钮列表传给components参数,导致按钮的回调无法被触发。

修复:导入ActionRow并包装按钮:

from disnake.ui import ActionRow

# 包装按钮到ActionRow
components = [ActionRow(*buttons)]
await interaction.followup.send(embed=embeds, components=components)

额外优化建议:添加异常捕获与自定义ID唯一性

  1. 异常捕获:在回调中加入异常捕获,方便调试错误:
async def callback(self, interaction: disnake.MessageInteraction):
    try:
        queries = qna["users"]["id"][self.user_id]["queries"][-5:]
        # 注意:如果queries是列表,直接用整数索引而非字符串索引
        query_number = str(queries[self.choice-1])
        query = qna["queries"]["id"][query_number]

        embed = disnake.Embed(title=f"Query for {query['user']}", color=0xff0000)
        embed.add_field(name="Question", value=query["question"], inline=False)
        embed.add_field(name="Answer", value=query["answer"], inline=False)

        await interaction.response.send_message(embed=embed, ephemeral=True)
    except Exception as e:
        await interaction.response.send_message(f"操作出错:{str(e)}", ephemeral=True)
        print(f"按钮回调错误详情:{e}")
  1. 唯一自定义ID:给每个按钮设置包含用户ID的唯一custom_id,避免不同用户的按钮冲突,比如f"query_btn_{user_id}_{i}"。

日志验证说明

从你提供的日志来看,Discord已经正确触发了button_click事件,但因为上述错误导致回调执行失败,最终交互超时显示失败。修复上述问题后,回调应该能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:20