Disnake库无法导入Modal模块的问题求助
Disnake库无法导入Modal模块的问题求助
问题描述
我在运行Discord机器人代码时遇到了导入错误,具体报错如下:
Traceback (most recent call last): File "C:\Users\Aaaaa\Desktop\boy\bot.py", line 2, in <module> from disnake import Intents, Modal, TextInputStyle, Embed, ButtonStyle, ActionRow, Button, ui ImportError: cannot import name 'Modal' from 'disnake' (C:\Users\Aaaaa\AppData\Local\Programs\Python\Python312\Lib\site-packages\disnake\__init__.py)
我觉得代码本身没有语法错误,但就是无法从disnake导入需要的模块。我已经尝试过重新安装disnake库,但问题依然存在。下面是我的完整代码:
import disnake from disnake import Intents, Modal, TextInputStyle, Embed, ButtonStyle, ActionRow, Button, ui from disnake.ext import commands intents = Intents.default() intents.members = True bot = commands.Bot(command_prefix="!", intents=intents) # Канал для отправки заявок APPLICATION_CHANNEL_ID = 1313915216211214476 # Замените на ID Вашего канала verification_message_id = None # Эмбед с предложением о верификации @bot.event async def on_ready(): print(f'Мы вошли как {bot.user}') channel = bot.get_channel(APPLICATION_CHANNEL_ID) embed = Embed(title="Верификация", description="Пожалуйста, нажмите кнопку ниже для заполнения формы верификации.") global verification_message_id verification_message = await channel.send(embed=embed, components=[Button(label="Заполнить форму", style=ButtonStyle.green)]) verification_message_id = verification_message.id # Обработка нажатия на кнопку @bot.component("Заполнить форму") async def form_button(interaction: disnake.MessageInteraction): modal = Modal("Форма верификации", timeout=60) modal.add_item(disnake.TextInput("Имя", style=TextInputStyle.short)) modal.add_item(disnake.TextInput("Возраст", style=TextInputStyle.short)) modal.add_item(disnake.TextInput("Цель прибывания", style=TextInputStyle.paragraph)) await interaction.send_modal(modal) # Обработка отправки модального окна @bot.modal("Форма верификации") async def handle_modal(modal: Modal, interaction: disnake.MessageInteraction): username = modal.children[0].value age = modal.children[1].value purpose = modal.children[2].value user = interaction.user embed = Embed(title="Новая заявка", description="Заявка на верификацию") embed.add_field(name="Имя", value=username) embed.add_field(name="Возраст", value=age) embed.add_field(name="Цель прибывания", value=purpose) embed.add_field(name="ID пользователя", value=user.id) embed.add_field(name="Дата создания аккаунта", value=user.created_at.strftime("%Y-%m-%d %H:%M:%S")) embed.add_field(name="Дата присоединения к серверу", value=user.joined_at.strftime("%Y-%m-%d %H:%M:%S")) embed.set_thumbnail(url=user.avatar.url) # Отправляем заявку в отдельный канал application_channel = bot.get_channel(APPLICATION_CHANNEL_ID) application_message = await application_channel.send(embed=embed, components=[ ActionRow( Button(label="Принять", style=ButtonStyle.green, custom_id="accept"), Button(label="Отклонить", style=ButtonStyle.red, custom_id="decline") ) ]) # Делаем так, чтобы пользователю отправлялось подтверждение await interaction.send("Ваша заявка была отправлена.", ephemeral=True) # Обработка кнопок принятия и отклонения заявки @bot.component("accept") async def accept_button(interaction: disnake.MessageInteraction): role = disnake.utils.get(interaction.guild.roles, name="member") # Замените на название Вашей роли await interaction.user.add_roles(role) await interaction.send("Заявка принята. Вы получили роль 'member'.", ephemeral=True) @bot.component("decline") async def decline_button(interaction: disnake.MessageInteraction): await interaction.send("Заявка отклонена.", ephemeral=True) # Запуск бота bot.run("TOKEN") # Замените на токен Вашего бота
解决方案
这个问题的核心是Disnake版本不兼容,下面分两种情况解决:
方案1:升级到最新版Disnake(推荐)
Modal、TextInputStyle这些组件在较旧的Disnake版本中并没有暴露在顶层disnake模块下,是在后续版本才移到顶层的。你需要升级到最新稳定版:
- 打开终端,执行命令查看当前版本:
pip show disnake - 如果版本低于2.5.0左右,执行升级命令:
如果你用了虚拟环境,确保在对应的虚拟环境中执行这条命令。pip install --upgrade disnake
升级完成后,你的原有导入语句应该就能正常工作了。
方案2:修改导入语句适配旧版本(仅临时使用)
如果你暂时不想升级,可以调整导入路径,从disnake.ui模块导入相关组件,同时修改代码中对应的引用:
- 把原来的导入行替换成:
import disnake from disnake import Intents, Embed, ButtonStyle, ActionRow, Button, ui from disnake.ui import Modal, TextInputStyle from disnake.ext import commands - 把代码中所有的
disnake.TextInput替换成ui.TextInput,比如:modal.add_item(ui.TextInput("Имя", style=TextInputStyle.short))
注意:旧版本的Disnake可能也不支持@bot.modal这种装饰器,所以长远来看还是升级到最新版本更稳妥,能避免更多兼容性问题。
备注:内容来源于stack exchange,提问作者user28629939
相关产品推荐
相关产品推荐

