Discord.py点击按钮触发Modal报错:无法找到项目空位的解决方法
Discord.py 按钮触发Modal时出现ValueError问题
点击按钮触发Modal时抛出ValueError: could not find open space for item错误,相关代码及报错信息如下:
相关代码
class ButtonModal(discord.ui.View): def __init__(self): super().__init__(timeout = None) @discord.ui.button(label = "Compile MODAL", emoji="📑",custom_id = "Role1", style = discord.ButtonStyle.primary) async def button1(self, interaction, button): user = interaction.user await interaction.response.send_modal(MyModal())
报错信息
[0m ?[31mERROR ?[0m ?[35mdiscord.ui.view?[0m Ignoring exception in view <ButtonModal timeout=None children=1> for item <Button style=<ButtonStyle.primary: 1> url=None disabled=False label='Compile MODAL' emoji=<PartialEmoji animated=False name='�' id=None> row=None> ?[31mTraceback (most recent call last): File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\view.py", line 425, in _scheduled_task await item.callback(interaction) File "c:\Users\Administrator\Desktop\RequisBOT\bot.py", line 67, in button1 await interaction.response.send_modal(MyModal()) ^^^^^^^^^ File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\modal.py", line 135, in __init__ super().__init__(timeout=timeout) File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\view.py", line 184, in __init__ self.__weights = _ViewWeights(self._children) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\view.py", line 99, in __init__ self.add_item(item) File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\view.py", line 116, in add_item index = self.find_open_space(item) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\RequisBOT\bot-env\Lib\site-packages\discord\ui\view.py", line 106, in find_open_space raise ValueError('could not find open space for item') ValueError: could not find open space for item?[0m
解决方案
这个错误的核心原因是Modal的组件布局违反了Discord的交互组件规则,具体修正方式如下:
- 严格遵守Modal布局限制:Discord的Modal中,每个ActionRow(行)只能放置1个TextInput组件,不能像普通View那样一行放多个控件。如果你的
MyModal类中把多个TextInput放在了同一行,会直接触发该错误。 - 控制组件数量:Modal最多只能包含5个TextInput(对应5行),超出数量也会导致布局空间不足。
- 显式指定row参数:为每个TextInput明确设置
row值(范围0-4),避免自动布局时出现冲突。示例代码:
class MyModal(discord.ui.Modal, title="编译设置"): def __init__(self): super().__init__(timeout=None) # 每个输入框单独占一行 self.add_item(discord.ui.TextInput(label="MOD名称", placeholder="输入你的MOD名称", row=0)) self.add_item(discord.ui.TextInput(label="编译参数", placeholder="填写编译参数", row=1)) # 最多可添加到row=4,共5个输入框
- 检查Modal继承与初始化:确保
MyModal正确继承discord.ui.Modal,且自定义__init__方法时调用了父类的__init__。
内容的提问来源于stack exchange,提问作者bakembo
相关产品推荐
相关产品推荐

