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唯一性
- 异常捕获:在回调中加入异常捕获,方便调试错误:
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}")
- 唯一自定义ID:给每个按钮设置包含用户ID的唯一
custom_id,避免不同用户的按钮冲突,比如f"query_btn_{user_id}_{i}"。
日志验证说明
从你提供的日志来看,Discord已经正确触发了button_click事件,但因为上述错误导致回调执行失败,最终交互超时显示失败。修复上述问题后,回调应该能正常执行。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

