所以我使用discord.py 创建一个简单的discord 模式。但是每当我运行代码时,我都会收到一个 attributeError ,指出“上下文”对象没有响应属性。我知道这是真的,但我需要通过函数传递交互来发送模态。
其他人建议在我的代码中添加 “await interaction.interaction.response.defer(ephemeral = True)”,但这似乎也不起作用。我想知道是否有其他方法可以使其发挥作用。我对模态感到困惑。请告诉我他们是否有不同的工作方式。
这是我的代码:
import discord
from discord.ext import commands
from discord import ui
intents = discord.Intents.default()
intents.message_content = True
client = commands.Bot(command_prefix="?",intents=intents.all())
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.command()
async def check(ctx):
await ctx.send("What's up chat")
@client.command()
async def banana(ctx):
await ctx.send("banana")
@client.command(name="modaltest")
async def modaltest(interaction: discord.Interaction):
class MyModal(ui.Modal,title="Whatsup"):
answer=discord.ui.TextInput(label="(LABEL_",style=discord.TextStyle.short, placeholder="Yes",default="Yes/No",required=True)
async def on_submit(self, interaction: discord.Interaction):
await interaction.response.send_message("It's time")
await interaction.interaction.response.defer(ephemeral=True)
await interaction.response.send_modal(MyModal())
client.run('MTIxODQ3Mzg2ODY1MDQ4MzczMw.G8d8uK.vj-ccD6EXDXBRS7QBTYs3AcVTBGDK366ElpJFk')
这是输出:
[2024-04-06 19:57:56] [INFO ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 81799a7cbd347820290acba7203ba543).
We have logged in as Test bot#2666
[2024-04-06 19:58:07] [ERROR ] discord.ext.commands.bot: Ignoring exception in command modaltest
Traceback (most recent call last):
File "C:\Users\abhyu\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ext\commands\core.py", line 235, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\abhyu\Desktop\python\main2.py", line 33, in modaltest
await interaction.interaction.response.defer(ephemeral=True)
AttributeError: 'NoneType' object has no attribute 'response'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\abhyu\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\abhyu\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ext\commands\core.py", line 1029, in invoke
await injected(*ctx.args, **ctx.kwargs) # type: ignore
File "C:\Users\abhyu\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ext\commands\core.py", line 244, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'response'
如果有人有办法实际运行模态,或者我的代码有问题,请告诉我!
(哦,还有一个问题,如何从模态中获取用户提交的输入)
首先,我不知道你最后一行中的它是否是真正的令牌,但永远不会在线分享它,因为它可以用来控制你的机器人。我建议您立即重置您的令牌,因为如果您不这样做,所有带有机器人的服务器都可能会受到损害。
现在看看错误: 在第 33 行你写了
await interaction.interaction.response.defer(ephemeral=True)
但必须如此
await interaction.response.defer(ephemeral=True)
另外,下面这是我的工作模式,但该类不在命令本身中:
class Modal(discord.ui.Modal):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.add_item(discord.ui.TextInput(label="Short Input"))
self.add_item(discord.ui.TextInput(label="Long Input", style=discord.TextStyle.long))
async def on_submit(self, interaction: discord.Interaction):
embed1=discord.Embed(title="Modal Results", description=f'|- **Short Input:** ```{self.children[0].value}``` |- **Long Input:** ```{self.children[1].value}```', color=discord.Colour.purple())
await interaction.response.send_message(embed=embed1, ephemeral=True)
在这种情况下,您将获得输入
{self.children[0].value}
和
{self.children[1].value}
可以在嵌入中看到的 f 字符串中使用,发送 on_submit。
希望我能帮上忙!如果出现任何其他问题或提供的代码不起作用,请随时与我联系。