#discord.py
Вопрос:
Код делает то, что должен делать, но после каждого нажатия кнопки он говорит: «Это взаимодействие не удалось». Нажатие кнопки изменяет вставку, чтобы изменить ее на другую. Как бы я избавился от этого сообщения об ошибке взаимодействия после нажатия кнопки?
проблема: https://i.stack.imgur.com/i4dTd.png
код, полученный от: https://github.com/elixss/YouTube/blob/main/source/buttons.py
Вот код:
@bot.group(invoke_without_command=True)
async def help(ctx):
# buttons
one = Button(style=1, label="Commands", id="em1")
two = Button(style=1, label="Depression", id="em2")
three = Button(style=1, label="Moderator", id="em3")
four = Button(style=1, label="Language", id="em4")
# embeds
em1 = Embed(title="Commands Plugin",color=0x5865F2)
em2 = Embed(title="Depression Plugin", description="placeholder", color=0x5865F2)
em3 = Embed(title="Moderator Plugin", description="placeholder", color=0x5865F2)
em4 = Embed(title="Language Plugin", description="placeholder", color=0x5865F2)
# main help embed
help_embed = Embed(description="> **Help Module**nPress on any button to view the commands for that selected plugin.",
color=discord.Color.random())
# buttons to embeds
buttons = {
"em1": em1,
"em2": em2,
"em3": em3,
"em4": em4
}
msg = await ctx.send(embed=help_embed,
components=[[one, two, three, four]])
while True:
event = await bot.wait_for("button_click", timeout=60.0)
if event.channel is not ctx.channel:
return
if event.channel == ctx.channel:
response = buttons.get(event.component.id)
await msg.edit(embed=response)
if response is None:
await event.channel.send("error, try again.")
Комментарии:
1. Встраивания должны быть
discord.Embed()
, а не простоEmbed()
2. @ChaoticNebula Нет. Он мог бы просто сделать
from discord import Embed
это вместоimport discord
этого . В этом нет ничего плохого.3. может быть … он импортировал его напрямую? @ChaoticNebula
4. Да, я использовал
from discord import Embed
5. Новая вещь, которую я узнал сегодня 😁
Ответ №1:
Как сказал Элиас, вы должны реагировать на взаимодействия, иначе это покажет, что «Это взаимодействие не удалось», но не с обычным ctx.send()
, а с (в вашем случае)
await event.respond(type=4, message="Responded!")
Если вы не хотите отправлять сообщение в ответ на нажатие кнопки или выбор в выборе, вы можете просто использовать type=6
без сообщения:
await event.respond(type=6)
Дополнительные сведения о типах см. в документации.
Ответ №2:
Лучший способ сделать это-либо удалить все кнопки после их нажатия, либо добавить время восстановления, которое автоматически удалит кнопки через определенное время.
В вашей ситуации это выглядело бы примерно так:
msg = await ctx.send(embed=help_embed, components=[[one, two, three, four]])
try:
res = await client.wait_for("button_click", timeout = 60)
except asyncio.TimeoutError:
await msg.edit(components = []) #removes buttons from message
else:
if res.author == message.author:
#when button is clicked
await msg.edit(components = [])
Это также предотвращает ограничение скорости, поэтому у вас нет кнопок, постоянно ожидающих ответа.
Комментарии:
1. Да, это способ , но это не лучший способ.