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

如何实现Disnake框架下Discord机器人按钮点击后禁用?

如何在Disnake中实现按钮点击后禁用

要实现按钮点击后变为禁用状态,核心是在处理点击事件时,更新对应按钮的disabled属性并重新编辑消息组件。以下是两种可行的实现方式:

方法一:直接修改点击的组件并更新

利用inter.component获取当前点击的按钮,将其disabled设为True,再通过edit_message更新消息的组件:

@bot.listen("on_button_click")
async def help_listener(inter: disnake.MessageInteraction):
    # 标记当前点击的按钮为禁用
    inter.component.disabled = True
    
    # 根据按钮ID生成对应Embed
    if inter.component.custom_id == "button1":
        embed = disnake.Embed(title="Heading button1", description="Description button1", color=0x992d22)
    elif inter.component.custom_id == "button2":
        embed = disnake.Embed(title="Heading button2", description="Description button2", color=0x992d22)
    elif inter.component.custom_id == "button3":
        embed = disnake.Embed(title="Heading button3", description="Description button3", color=0x992d22)
    
    # 更新消息的Embed和组件(组件使用修改后的原组件列表)
    await inter.response.edit_message(embed=embed, components=inter.message.components)

方法二:重新构建组件列表

如果需要更灵活地控制组件状态(比如禁用多个按钮),可以重新构建组件数组,将目标按钮设为禁用:

@bot.listen("on_button_click")
async def help_listener(inter: disnake.MessageInteraction):
    # 重新构建按钮组件,将点击的按钮设为禁用
    new_components = []
    for button in inter.message.components[0].children:
        if button.custom_id == inter.component.custom_id:
            # 复制原按钮属性并设置disabled=True
            new_button = disnake.ui.Button(
                label=button.label,
                style=button.style,
                custom_id=button.custom_id,
                disabled=True
            )
            new_components.append(new_button)
        else:
            new_components.append(button)
    
    # 生成对应Embed
    if inter.component.custom_id == "button1":
        embed = disnake.Embed(title="Heading button1", description="Description button1", color=0x992d22)
    elif inter.component.custom_id == "button2":
        embed = disnake.Embed(title="Heading button2", description="Description button2", color=0x992d22)
    elif inter.component.custom_id == "button3":
        embed = disnake.Embed(title="Heading button3", description="Description button3", color=0x992d22)
    
    # 更新消息
    await inter.response.edit_message(embed=embed, components=[new_components])

关键说明

  • Discord的组件状态是通过消息编辑来同步的,必须调用edit_message并传入更新后的组件列表,才能让客户端显示禁用状态。
  • 方法一更简洁,适合仅禁用当前点击按钮的场景;方法二更灵活,适合需要批量修改组件状态的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:30