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

Discord.py下拉菜单重复发送及菜单冗余问题求助

问题分析

你的问题核心是每次选择第一个下拉菜单时,都会往同一个MtView实例里重复添加NewSelect组件。因为self.add_item(NewSelect())是在当前MtView对象上追加组件,第二次选择时该实例已经包含了之前添加的NewSelect,再次添加就会出现两个,以此类推,最终发送的临时消息里会堆积多个重复的下拉菜单。

解决方案

解决关键是:不要在原命令发送的MtView实例上追加组件,而是创建全新的View来承载NewSelect,确保每次发送的临时消息里只有一个下拉菜单。

修改后的代码如下:

class NewSelect(discord.ui.Select):
    def __init__(self):
        options = [
            discord.SelectOption(label='Ssssss', value='h'),
            discord.SelectOption(label='2ssss', value='54'),
            discord.SelectOption(label='sfsfsf', value='ghghhh')
        ]
        super().__init__(options=options, placeholder='What ',)
  
    async def callback(self, interaction: discord.Interaction):
        # 保留你的回调逻辑
        pass

class MtView(discord.ui.View):
    answer1 = None  
    answer2 = None

    @discord.ui.select(
        placeholder='Выберите отдел',
        options=[
            discord.SelectOption(label='Дискорд отдел 🔧', value='discord'),
            discord.SelectOption(label='Модераторский отдел 🎮', value='game'),
        ]
    )
    async def what_category(self, interaction: discord.Interaction, select_item=discord.ui.Select):
        self.answer1 = select_item.values
        # 创建全新的临时View,仅添加一个NewSelect
        temp_view = discord.ui.View()
        temp_view.add_item(NewSelect())
        # 发送临时消息,使用独立的新View
        await interaction.response.send_message(view=temp_view, ephemeral=True)
    
@aclient.command()
async def test(ctx):
    view = MtView()
    await ctx.send(view=view)
关键修改点
  • 取消对原MtView实例的组件追加操作,改为创建独立的临时View来承载NewSelect
  • 每次选择第一个菜单时,都会生成一个干净的新View,里面仅包含一个NewSelect组件,彻底避免重复累加

这样无论多少次选择第一个下拉菜单,发送的临时消息里都只会有一个NewSelect菜单,不会出现冗余副本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:42:41