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

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模块下,是在后续版本才移到顶层的。你需要升级到最新稳定版:

  1. 打开终端,执行命令查看当前版本:
    pip show disnake
    
  2. 如果版本低于2.5.0左右,执行升级命令:
    pip install --upgrade disnake
    
    如果你用了虚拟环境,确保在对应的虚拟环境中执行这条命令。

升级完成后,你的原有导入语句应该就能正常工作了。

方案2:修改导入语句适配旧版本(仅临时使用)

如果你暂时不想升级,可以调整导入路径,从disnake.ui模块导入相关组件,同时修改代码中对应的引用:

  1. 把原来的导入行替换成:
    import disnake
    from disnake import Intents, Embed, ButtonStyle, ActionRow, Button, ui
    from disnake.ui import Modal, TextInputStyle
    from disnake.ext import commands
    
  2. 把代码中所有的disnake.TextInput替换成ui.TextInput,比如:
    modal.add_item(ui.TextInput("Имя", style=TextInputStyle.short))
    

注意:旧版本的Disnake可能也不支持@bot.modal这种装饰器,所以长远来看还是升级到最新版本更稳妥,能避免更多兼容性问题。

备注:内容来源于stack exchange,提问作者user28629939

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:08:12