У меня возникла проблема с тем, как отключить кнопку discord.py при нажатии.
Запуск button.disabled = True в обратном вызове ничего не сделал.
Я пытался:
async def button_callback(interaction):
interaction.response.send_message("You clicked me! Now I'm disabling this.")
button1.disabled = True
button1.callback = button_callback
Код находится в другой функции, в которой есть кнопка button1.
Я ожидал, что кнопка будет отключена. Что случилось, так это то, что осталось прежним. (без ошибок)
Примечание: я не хочу устанавливать другие модули или создавать новые классы. Спасибо! (Я хочу и использую ТОЛЬКО сам Discord.PY)






При внесении любых изменений в компоненты Представления вам необходимо будет обновить представление сообщения, чтобы это изменение вступило в силу на стороне разногласий. Кроме того, я рекомендую вам создавать свои представления с помощью унаследованных классов. Я покажу вам пример представления, где кнопка отключена после нажатия:
import discord
class MyView(discord.ui.View):
@discord.ui.button(label = "Click Here", style=discord.ButtonStyle.green)
async def click_here(self, interaction: discord.Interaction, button: discord.Button):
# disabling the button
button.disabled = True
# assuming you sent the view along with an Embed
emb = interation.message.embeds[0]
emb.description = "You clicked me! Now I'm disabling this."
# updating the message view and embed
await interaction.response.edit_message(embed=emb, view=self)
Чтобы отправить это представление, просто используйте view=MyView() при ответе на команду.
Да. Вы можете использовать self.children для перебора кнопок просмотра.
Дополнение к вопросу: я отправил вставку в родительскую функцию. Как я могу обновить его, если его нет в классе? Моя вставка: discord.Embed(title = "Press a Button", description = "click one")
Вы можете получить вставку, используя interaction.message.embeds[0]
Я не совсем понимаю, как работает код. Можете ли вы привести пример? Спасибо! примечание: у меня много вставок, а не одна
Вы работаете с Webhooks? Обычное сообщение может иметь только одно встраивание
Нет. Я имею в виду, что есть одно встраивание, и представление встраивания - MyView(). Я не понимаю, как использовать interaction.message.embeds[0]. Это как interaction.message.embeds[0].edit_message(view=self)? Спасибо!
Если вы хотите отредактировать вставку, просто добавьте параметр: await interaction.response.edit_message(view=self, embed=my_embed).
Я редактирую ответ, показывающий, как редактировать описание встраивания сообщения.
Пожалуйста, ознакомьтесь с документацией: discordpy.readthedocs.io/en/stable/interactions/…
У меня много вставок, в функции send_embed. Есть ли способ, которым я могу редактировать отдельные вставки? На данный момент я получу другие модули, если это необходимо. (извините, я новый разработчик Discord Bot)
Я не понимаю, что вы подразумеваете под многими вставками. Сообщение может иметь только одно встраивание (если только оно не отправлено веб-перехватчиком).
Мол, есть функция send_embed, и в ней есть вставка. Поскольку бот предназначен для обработки более 1 сообщения, я не могу сделать его глобальной переменной, только функциональной. Как я должен ссылаться на точную вставку в классе MyView? Должен. Я делаю вставку входом в класс?
Да, вы можете передать в класс тот Embed, который хотите отправить.
Я получаю это: discord.app_commands.errors.CommandInvokeError: Command 'send_embed' raised an exception: AttributeError: 'MyView' object has no attribute '_children' когда я бегу view = MyView(embed)
Похоже, вы не унаследовали класс discord.View
Если вы хотите добавить атрибуты к MyView, вы должны сделать это, определив метод __init__().
Я сделал. Я дал def __init__(self, embed) потом self.embed = embed.
Вы вызывали super().__init__() в своем __init__ методе MyView?
Есть ли способ отключить другие кнопки одним нажатием? Пример: если вы нажмете
b1, он отключитb1,b2иb3Спасибо!