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

Discord.py中/settings命令下拉菜单位置调整问题

解决discord.py中下拉菜单显示在按钮下方的问题

问题出在组件的添加顺序上:你用@discord.ui.button装饰的按钮,会在调用super().__init__()时自动被添加到View的组件列表最前面;而你在__init__里手动创建并添加的下拉菜单,是追加到列表末尾,所以最终按钮显示在上方,下拉在下方。

修复方案一:调整初始化顺序

把下拉菜单的创建和添加放在super().__init__()之前,这样下拉会先被加入组件列表,之后装饰器的按钮才会被追加到后面,就能实现下拉在按钮上方的效果:

class Settings(discord.ui.View):
    def __init__(self) -> None:
        self.value = None
        self.build_options()

        # 先创建并添加下拉菜单
        select = discord.ui.Select(options=self.options)
        select.callback = self.select_option
        self.add_item(select)
        
        # 再调用父类初始化,加载装饰器定义的按钮
        super().__init__()

    def build_options(self):
        if get_name() == "":
            self.options = [
                discord.SelectOption(
                    label=" ",
                    default=True
                )
            ]
        else:
            self.options = [
                discord.SelectOption(
                    label=get_name(),
                    default=True
                )
            ]
    
    async def select_option(self, interaction: discord.Interaction, select: discord.ui.Select):
        if select.values[0] == "None":
            await interaction.response.send_message("None", ephemeral=True)
        else:
            await interaction.response.send_message("None", ephemeral=True)

    @discord.ui.button(label="Add", emoji="<:add:1203694266573127680>", style=discord.ButtonStyle.success)
    async def add_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_modal(New())

    @discord.ui.button(label="Edit", emoji="<:edit:1203694268473151558>", style=discord.ButtonStyle.secondary)
    async def edit_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...

    @discord.ui.button(label="Delete", emoji="<:trash:1204886545765503056>", style=discord.ButtonStyle.danger)
    async def delete_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...

修复方案二:手动添加所有组件(不使用按钮装饰器)

如果你想完全控制组件顺序,可以放弃@discord.ui.button装饰器,手动创建每个按钮并按顺序添加,先加下拉,再加按钮:

class Settings(discord.ui.View):
    def __init__(self) -> None:
        super().__init__()
        self.value = None
        self.build_options()

        # 添加下拉菜单
        select = discord.ui.Select(options=self.options)
        select.callback = self.select_option
        self.add_item(select)

        # 添加Add按钮
        add_btn = discord.ui.Button(label="Add", emoji="<:add:1203694266573127680>", style=discord.ButtonStyle.success)
        add_btn.callback = self.add_profile
        self.add_item(add_btn)

        # 添加Edit按钮
        edit_btn = discord.ui.Button(label="Edit", emoji="<:edit:1203694268473151558>", style=discord.ButtonStyle.secondary)
        edit_btn.callback = self.edit_profile
        self.add_item(edit_btn)

        # 添加Delete按钮
        delete_btn = discord.ui.Button(label="Delete", emoji="<:trash:1204886545765503056>", style=discord.ButtonStyle.danger)
        delete_btn.callback = self.delete_profile
        self.add_item(delete_btn)

    def build_options(self):
        if get_name() == "":
            self.options = [
                discord.SelectOption(
                    label=" ",
                    default=True
                )
            ]
        else:
            self.options = [
                discord.SelectOption(
                    label=get_name(),
                    default=True
                )
            ]
    
    async def select_option(self, interaction: discord.Interaction, select: discord.ui.Select):
        if select.values[0] == "None":
            await interaction.response.send_message("None", ephemeral=True)
        else:
            await interaction.response.send_message("None", ephemeral=True)

    async def add_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_modal(New())

    async def edit_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...

    async def delete_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...

两种方案都能实现下拉菜单显示在按钮上方的效果,选你习惯的方式就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:36