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

PyCord工单按钮禁用与激活逻辑调整需求

解决Discord工单按钮状态切换问题

核心实现步骤

  • 将Unclaim按钮默认设置为禁用状态
  • 实现update_buttons方法统一管理按钮状态切换逻辑
  • 在Claim和Unclaim的回调中调用该方法,更新状态后刷新消息视图

修改后的完整代码

class TicketViewButtonEmMSG(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)
        self.claimed_by = None

    def update_buttons(self):
        # 通过custom_id获取对应按钮
        claim_btn = self.get_item("ClaimTicket")
        unclaim_btn = self.get_item("UnclaimTicket")
        
        if self.claimed_by is not None:
            # 已认领状态:禁用Claim,启用Unclaim
            claim_btn.disabled = True
            unclaim_btn.disabled = False
        else:
            # 未认领状态:启用Claim,禁用Unclaim
            claim_btn.disabled = False
            unclaim_btn.disabled = True

    @discord.ui.button(
        label='Ticket schließen',
        emoji='<:AC_JavaScript:1058484252594929856>',
        style=discord.ButtonStyle.grey,
        custom_id='close'
    )
    async def callback1(self, button, interaction):
        emClose = discord.Embed(
            title='<:AC_JavaScript:1058484252594929856> - TICKET SCHLIEßEN',
            description=f'{interaction.user.mention}, wähle bitte einen Grund zur (Ticket-)Schließung aus.',
            color=0x2b2c30
        )
        await interaction.response.send_message(embed=emClose, view=CloseDropdown(), ephemeral=True)

    @discord.ui.button(
        label='Ticket claimen',
        emoji='<:AC_Mauszeiger:1058472762290753639>',
        style=discord.ButtonStyle.grey,
        custom_id="ClaimTicket"
    )
    async def callback(self, button, interaction):
        member = interaction.user
        staffRole = interaction.guild.get_role(905829680811216979)
        
        if staffRole in member.roles:
            ClaimEm = discord.Embed(
                title='<:AC_Ordner:1058480497614930001> - TICKET GECLAIMT',
                description=f'<:AC_PunktPink:1035563260377837639> Dein **Ticket** wurde von {member.mention} **geclaimt**.',
                color=0x2b2c30
            )
            await interaction.response.send_message(embed=ClaimEm)
            self.claimed_by = member.id
            # 更新按钮状态并刷新视图
            self.update_buttons()
            await interaction.message.edit(view=self)
        else:
            Err = discord.Embed(
                title=f'<:AC_Nope:1060555374815629362> - Fehler!',
                description=f'<:AC_PunktPink:1035563260377837639> Du kannst dein eigenes Ticket **nicht claimen**!',
                color=0x2b2c30
            )
            await interaction.response.send_message(embed=Err, ephemeral=True)

    @discord.ui.button(
        label='Ticket unclaimen',
        emoji='<:AC_Join:1060566086107533392>',
        style=discord.ButtonStyle.grey,
        custom_id='UnclaimTicket',
        disabled=True  # 默认禁用Unclaim按钮
    )
    async def callback2(self, button, interaction):
        member = interaction.user

        if self.claimed_by == member.id:
            await interaction.response.send_message('Dieses ticket ist nun nicht mehr geclaimt.')
            self.claimed_by = None
            # 更新按钮状态并刷新视图
            self.update_buttons()
            await interaction.message.edit(view=self)
        else:
            await interaction.response.send_message("Du kannst diesen Button leider nicht benutzen. Du musst zuerst dieses Ticket claimen.")

关键部分说明

  1. 默认禁用Unclaim按钮:在Unclaim按钮的装饰器中添加disabled=True参数,实现初始禁用效果。
  2. update_buttons方法:通过get_item方法根据custom_id定位按钮,依据claimed_by的值判断当前工单状态,统一设置两个按钮的禁用/启用状态,避免重复代码。
  3. 回调中更新状态:在Claim成功后设置claimed_by并调用update_buttons,然后刷新消息视图;在Unclaim成功后重置claimed_by并调用update_buttons,确保按钮状态实时同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:46:14