如何移除Discord消息按钮?实现点击按钮后编辑并移除按钮
解决Discord按钮点击后移除按钮并编辑消息的问题
原代码实现了点击按钮后切换消息内容,但点击后按钮依然保留,要实现编辑消息同时移除按钮,只需要在编辑消息时指定view=None即可,以下是修改后的完整代码:
button = Button(style = discord.ButtonStyle.green, emoji = ":arrow_backward:", custom_id = "button1") button2 = Button(style = discord.ButtonStyle.green, emoji = ":arrow_up_small:", custom_id = "button2") button3 = Button(style = discord.ButtonStyle.green, emoji = ":arrow_forward:", custom_id = "button3") view = View() view.add_item(button) view.add_item(button2) view.add_item(button3) async def button_callback(interaction): if number != ("⠀⠀1"): await message.edit(content="**response 1**", view=None) else: await message.edit(content="**response 2**", view=None) # 响应交互避免Discord提示失败 await interaction.response.defer() async def button_callback2(interaction): if number != ("⠀⠀⠀⠀⠀⠀⠀⠀⠀2"): await message.edit(content="**response 1**", view=None) else: await message.edit(content="**response 2**", view=None) await interaction.response.defer() async def button_callback3(interaction): if number != ("⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀3"): await message.edit(content="**response 1**", view=None) else: await message.edit(content= "**response 2**", view=None) await interaction.response.defer() button.callback = button_callback button2.callback = button_callback2 button3.callback = button_callback3 await message.edit(content= f"⠀⠀:watermelon:⠀⠀⠀⠀⠀:watermelon:⠀⠀⠀⠀⠀:watermelon:\n{number}", view=view)
关键改动说明:
- 在每个
message.edit()调用中添加view=None参数:Discord会在编辑消息时移除所有按钮组件 - 新增
await interaction.response.defer():点击按钮后必须对交互做出响应,否则Discord会显示"交互失败"的提示,defer表示延迟响应(此处已完成消息编辑,用defer即可)
额外优化建议(可选):
三个回调函数逻辑高度重复,可以合并为一个通用回调,通过interaction.data["custom_id"]区分点击的按钮,减少冗余代码:
async def universal_button_callback(interaction): button_id = interaction.data["custom_id"] # 根据custom_id匹配对应的number值 target_number = { "button1": "⠀⠀1", "button2": "⠀⠀⠀⠀⠀⠀⠀⠀⠀2", "button3": "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀3" }[button_id] if number != target_number: await message.edit(content="**response 1**", view=None) else: await message.edit(content="**response 2**", view=None) await interaction.response.defer() # 给所有按钮绑定同一个回调 button.callback = universal_button_callback button2.callback = universal_button_callback button3.callback = universal_button_callback
内容的提问来源于stack exchange,提问作者Isohel
相关产品推荐
相关产品推荐

