
本文旨在解决 discord.py 中交互按钮常见的“interaction error”问题。核心在于理解按钮回调函数(如 `agree_btn`)的正确参数签名,即只应包含 `self`、`interaction` 和 `button`。文章将详细解释错误原因,并提供两种安全有效的数据传递方法:通过 `view` 类的 `__init__` 方法传递数据,以及更高级的持久化存储方案,确保按钮功能正常且数据可访问。
在使用 Discord.py 2.0+ 版本开发机器人时,交互按钮(discord.ui.Button)是实现丰富用户体验的重要组件。然而,开发者常会遇到一个“interaction error”,尤其是在尝试向按钮的回调函数中传递额外参数时。
按钮回调函数的标准签名
discord.ui.button 装饰器修饰的方法,其回调函数签名是严格规定的。它通常期望接收三个参数:
任何额外的参数,如 user: discord.Member,都会导致 Discord 无法正确解析回调,从而引发“interaction error”。
考虑以下一个模拟求婚系统的代码片段,它试图在按钮回调中直接使用 user 参数:
import discord
# 假设 client 已初始化并与 Discord 连接
# client = discord.Client(intents=discord.Intents.default())
# tree = discord.app_commands.CommandTree(client)
class MarryButtons(discord.ui.View):
def __init__(self):
super().__init__()
@discord.ui.button(label="Yes", style=discord.ButtonStyle.success)
async def agree_btn(self, interaction: discord.Interaction, button: discord.ui.Button, user: discord.Member):
# 错误:这里多了一个 user 参数
embed_agree = discord.Embed(title=f'{user.mention} answered YES', description=f'{user.mention} now married to {interaction.user.mention}')
await interaction.response.send_message(embed=embed_agree)
@discord.ui.button(label="No", style=discord.ButtonStyle.danger)
async def disagree_btn(self, interaction: discord.Interaction, button: discord.ui.Button, user: discord.Member):
# 错误:这里多了一个 user 参数
embed_disagree = discord.Embed(title=f'{user.mention} answered NO', description=f'{user.mention} declined propose from {interaction.user.mention}')
await interaction.response.send_message(embed=embed_disagree)
@discord.ui.button(label="?", style=discord.ButtonStyle.gray)
async def emoji_btn(self, interaction: discord.Interaction, button: discord.ui.Button, user: discord.Member):
# 错误:这里多了一个 user 参数
embed_emoji = discord.Embed(title=f'{user.mention} canceled propose', description=f'Nothing changed')
await interaction.response.send_message(embed=embed_emoji)
# 假设这是一个 slash command
# @tree.command(name='marry', description="Suggest to marry")
# async def marry(interaction: discord.Interaction, user: discord.Member):
# if interaction.user == user:
# await interaction.response.send_message(content=f"{interaction.user.mention} you can't marry yourself :(")
# return
# else:
# embed_marry = discord.Embed(title='WOW.....', description=f'{interaction.user.mention} suggest a marry to {user.mention}', color=0x774dea)
# await interaction.response.send_message(embed=embed_marry, view=MarryButtons())当用户点击上述代码中的按钮时,Discord 会尝试调用 agree_btn 等方法,但由于其签名与预期不符(多了一个 user 参数),就会导致“interaction error”。
要解决这个问题,我们需要移除回调函数中多余的参数,并采用其他机制来传递数据。
家作
淘宝推出的家装家居AI创意设计工具
149
查看详情
最常见且推荐的做法是将需要在按钮回调中访问的数据,在 View 类实例化时通过其 __init__ 方法传递进去,并作为实例属性存储。这样,按钮回调函数就可以通过 self. 来访问这些数据。
以下是修正后的求婚系统代码示例:
import discord
# 假设 client 已初始化并与 Discord 连接
# client = discord.Client(intents=discord.Intents.default())
# tree = discord.app_commands.CommandTree(client)
class MarryButtons(discord.ui.View):
def __init__(self, proposer: discord.Member, target: discord.Member):
super().__init__(timeout=180) # 设置一个超时时间,防止视图永久存在
self.proposer = proposer
self.target = target
@discord.ui.button(label="Yes", style=discord.ButtonStyle.success)
async def agree_btn(self, interaction: discord.Interaction, button: discord.ui.Button):
# 确保只有被求婚者才能点击“Yes”或“No”
if interaction.user != self.target:
await interaction.response.send_message("你不是被求婚者,无法操作。", ephemeral=True)
return
embed_agree = discord.Embed(
title=f'{self.target.display_name} 接受了求婚!',
description=f'{self.target.mention} 现在与 {self.proposer.mention} 喜结连理。',
color=discord.Color.green()
)
# 禁用所有按钮,防止重复点击
self.stop() # 停止视图,防止进一步交互
await interaction.response.edit_message(embed=embed_agree, view=None) # 移除按钮
# 也可以发送新的消息
# await interaction.response.send_message(embed=embed_agree)
@discord.ui.button(label="No", style=discord.ButtonStyle.danger)
async def disagree_btn(self, interaction: discord.Interaction, button: discord.ui.Button):
if interaction.user != self.target:
await interaction.response.send_message("你不是被求婚者,无法操作。", ephemeral=True)
return
embed_disagree = discord.Embed(
title=f'{self.target.display_name} 拒绝了求婚。',
description=f'{self.target.mention} 拒绝了 {self.proposer.mention} 的求婚。',
color=discord.Color.red()
)
self.stop() # 停止视图
await interaction.response.edit_message(embed=embed_disagree, view=None) # 移除按钮
@discord.ui.button(label="?", style=discord.ButtonStyle.gray)
async def emoji_btn(self, interaction: discord.Interaction, button: discord.ui.Button):
# 允许求婚者或被求婚者取消
if interaction.user not in [self.proposer, self.target]:
await interaction.response.send_message("你无权取消此求婚。", ephemeral=True)
return
embed_emoji = discord.Embed(
title='求婚已取消',
description='求婚被发起人或被求婚者取消,状态未改变。',
color=discord.Color.light_gray()
)
self.stop() # 停止视图
await interaction.response.edit_message(embed=embed_emoji, view=None) # 移除按钮
# 假设 client 和 tree 已初始化
# client = discord.Client(intents=discord.Intents.default())
# tree = discord.app_commands.CommandTree(client)
@tree.command(name='marry', description="向某人求婚")
async def marry(interaction: discord.Interaction, user: discord.Member):
if interaction.user == user:
await interaction.response.send_message(content=f"{interaction.user.mention} 你不能向自己求婚 :(", ephemeral=True)
return
# 实例化 MarryButtons 时传入求婚者和被求婚者
view = MarryButtons(proposer=interaction.user, target=user)
embed_marry = discord.Embed(
title='? 惊喜求婚!',
description=f'{interaction.user.mention} 向 {user.mention} 发起了求婚!',
color=0x774dea
)
await interaction.response.send_message(embed=embed_marry, view=view)
# 在机器人启动时同步命令
# @client.event
# async def on_ready():
# print(f'Logged in as {client.user}')
# await tree.sync()
# print('Commands synced')
# client.run('YOUR_BOT_TOKEN')代码改进点说明:
View 的监听,防止其他按钮被点击。同时,通过 edit_message(view=None) 移除消息上的按钮,可以提供更好的用户体验。对于需要管理多个并发请求或更复杂状态的系统,仅仅通过 View 实例传递数据可能不够。在这种情况下,可以考虑使用:
这种方法更健壮,但实现起来也更复杂,需要额外的逻辑来管理数据的存储、检索和清理。
通过遵循这些原则,开发者可以有效地利用 Discord.py 的交互按钮功能,构建稳定且用户友好的机器人应用。
以上就是Discord.py 交互按钮回调参数错误及数据传递指南的详细内容,更多请关注其它相关文章!
# 用户登录
# 深圳健康网站推广营销
# 放心的教育网站推广平台
# 专业网站推广思路有哪些
# 重庆优化网站厂家招聘
# 东莞金融网站建设
# 梅州网站seo推广
# seo自己优势
# 九龙坡企业网站建设案例
# 益阳seo优化哪家不错
# 网站推广培训方案设计
# 自动登录
# 操作流程
# 人时
# 数据库中
# js
# 并与
# 你不是
# 所需
# 移除
# 回调
# red
# 并发请求
# 权限验证
# 持久化存储
# ai
# 回调函数
# app
# json
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《微信》视频号原创声明开启方法
告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度
小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】
漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明
在PySimpleGUI中实现键盘按键绑定按钮事件
《三国:谋定天下》平民全阶段通用阵容
word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法
《sketchbook》选中部分图案移动方法
《盗墓笔记手游》技能介绍
铁路12306入口 铁路12306官网版入口登录网址
J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析
汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口
win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】
Pydantic 中“schema”字段命名冲突的解决方案
胃动力不足?试试这5个调理方法
飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读
外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!
冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤
TikTok网页版入口快速访问 TikTok官网账号登录方法
重返未来:1999卡戎全方位攻略
Python实战:高效处理实时数据流中的最小/最大值
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
《鹿路通》退余额方法
百度识图图像分析 百度识图识别平台
圆通快递官网入口查询单号 手机版官方查询入口
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
铁路12306怎么申请退票_铁路12306退票申请操作流程
123平台官方登录入口 123邮箱网页端在线沟通工具
CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现
yy漫画官方网站登录入口_yy漫画在线阅读页面地址
Google Drive API服务器端访问指南:服务账户认证详解
《长生:天机降世》火塔小怪大全
知音漫客官网首页入口_知音漫客热门漫画推荐
江苏大剧院会员卡购买步骤
韩剧圈正版官网入口_韩剧圈官方指定登录
深入理解Python对象引用与链表属性赋值
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例
win11关机几秒又自己开机 Win11关机自动重启问题修复
4399造梦西游3无敌版_4399游戏入口
Flash AS3.0简易相册制作
微信客户端怎么查看二维码_微信客户端个人二维码查看方法
qq邮箱格式填写示例 qq邮箱标准填写规范
Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】
使用AI在VS Code中将代码从一种语言翻译成另一种
漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐
Dash应用多值文本输入处理与类型转换教程
Go语言反射机制下访问嵌入结构体中的被遮蔽方法
泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口
VS Code源代码管理(SCM)视图的进阶使用技巧
2025-11-23
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。