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
相关产品推荐
相关产品推荐

