Discord.py机器人执行命令后无法发送按钮组件排查求助
先说说你的情况:你用手机开发的Discord.py机器人,执行button命令后既发不出带按钮的消息,也没有任何报错,试过按教程操作、装全依赖还是解决不了,贴出的代码如下:
@client.command() async def button(ctx): await ctx.send("Press Button", components = [Button(label="CLICK Me!") ] ) interaction = await client.wait_for("button_click", check=lambda i: i.component.label.startswith("Click")) await interaction.respond(content="Clicked!")
我帮你梳理几个最可能的问题,你可以逐一排查:
没有初始化Discord Components库
用discord_components的话,必须在机器人启动前完成初始化,否则组件根本不会生效。你需要在client.run(你的token)这行代码之前,加上这行:DiscordComponents(client)很多手机开发时容易分心漏掉这一步,这是最常见的原因。
检查条件里的大小写不匹配
你设置的按钮标签是"CLICK Me!"(全大写开头),但wait_for的检查条件里写的是startswith("Click")(首字母大写后面小写),这就导致点击按钮后,机器人识别不到匹配的交互,自然不会有响应。把检查条件改成startswith("CLICK")或者直接去掉大小写限制(比如转成小写比较):interaction = await client.wait_for("button_click", check=lambda i: i.component.label.lower().startswith("click"))组件格式需要用ActionRow包裹
部分版本的discord-components要求按钮必须放在ActionRow组件里才能被正确渲染,你现在直接把Button放进components列表可能不被识别。修改成这样试试:await ctx.send("Press Button", components = [ActionRow([Button(label="CLICK Me!")])] )记得要先导入ActionRow:
from discord_components import Button, ActionRow依赖版本兼容性问题
如果你的discord.py版本太新(比如v2.x以上),它已经内置了自己的按钮组件系统,和第三方的discord-components库会有冲突;反过来,如果用了太旧的discord.py,也可能和新版本的组件库不兼容。你可以检查一下版本:- 手机端如果用Termux的话,输入
pip show discord.py和pip show discord-components查看版本 - 建议搭配:discord.py v1.7.3 + discord-components v2.1.2,这个组合是比较稳定的
- 手机端如果用Termux的话,输入
排查完这些点,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者ZTone133

