(Py-cord) Как добавить view, который принимает некоторые значения?

Рейтинг: 0Ответов: 1Опубликовано: 21.08.2023

У меня есть класс (точнее 2, но это ничего не меняет). Я хочу добавить его в bot.add_view(), но класс принимает некоторые значения, из-за чего возникает ошибка TypeError: __init__() missing 3 required positional arguments: 'q_embed', 'title', and 'link'. Как это побороть? Вот сам код:

import discord
from discord.ext import commands

bot = commands.Bot(intents = discord.Intents.all())

@bot.event
async def on_ready():
    bot.add_view(unhide())
    bot.add_view(hide())

class unhide(discord.ui.View):
    def __init__(self, q_embed, title, link):
        super().__init__(timeout = None)
        self.q_embed = q_embed
        self.title = title
        self.link = link
    @discord.ui.button(label = 'Развернуть', style = discord.ButtonStyle.grey, custom_id = 'unhide')
    async def unhide(self, button, interaction):
        link_button = discord.ui.Button(label = 'Перейти к вопросу', style = discord.ButtonStyle.url, url = self.link)
        view = hide(self.q_embed, self.title, self.link)
        view.add_item(link_button)
        await interaction.response.edit_message(content = '(Просмотрено)', embed = self.q_embed, view = view)

class hide(discord.ui.View):
    def __init__(self, q_embed, title, link):
        super().__init__(timeout = None)
        self.q_embed = q_embed
        self.title = title
        self.link = link
    @discord.ui.button(label = 'Свернуть', style = discord.ButtonStyle.grey, custom_id = 'hide')
    async def hide(self, button, interaction):
        embed = discord.Embed(title = '(Просмотрено)', description = self.title)
        await interaction.response.edit_message(content = None, embed = embed, view = unhide(self.q_embed, self.title, self.link))

Ответы

▲ 1Принят

В классе MyView() следует создать функцию __init__ с аргументами, которые мы хотим передать и определить self-переменные:

class MyView(discord.ui.View):
    def __init__(q_embed, title, link): 
        super().__init__()
        self.q_ember = q_ember
        self.title = title
        self.link=link
    ...

Ну и используем bot.add_view(q_embed, title, link).


Использовать переменные в классе можно с помощью self.q_embed, self.title и self.link.


Дубликат этого вопроса.