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.")
关键部分说明
- 默认禁用Unclaim按钮:在
Unclaim按钮的装饰器中添加disabled=True参数,实现初始禁用效果。 - update_buttons方法:通过
get_item方法根据custom_id定位按钮,依据claimed_by的值判断当前工单状态,统一设置两个按钮的禁用/启用状态,避免重复代码。 - 回调中更新状态:在
Claim成功后设置claimed_by并调用update_buttons,然后刷新消息视图;在Unclaim成功后重置claimed_by并调用update_buttons,确保按钮状态实时同步。
内容的提问来源于stack exchange,提问作者user21193073
相关产品推荐
相关产品推荐

