Экспорт переменной из функции класса
В классе CreateProduct в функции callback рассчитывается стоимость товара. Полученный результат нужно использовать при нажатии кнопки "Премиум" в функции listener для расчета комиссии. Сейчас price - локальная переменная. Как сделать так, чтобы ее можно было использовать в функции listener.
class CreateProduct(disnake.ui.Modal):
def __init__(self):
components = [
disnake.ui.TextInput(
label="Желаемый доход",
placeholder="После вычета комиссий (в рублях)",
custom_id="price",
style=TextInputStyle.short
)
]
super().__init__(title="Расчет стоимости", components=components)
async def callback(self, inter: disnake.ModalInteraction):
value = inter.text_values
price = int(value["price"]) / 0.72
price = round(price)
embed = disnake.Embed(
title="Расчет выполнен",
color=0x2663F0
)
embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")
embed.add_field(name="Придет на карту:", value="```" + str(card) + " руб.```")
await inter.response.edit_message(embed=embed, components=[
disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
disnake.ui.Button(label="Премиум", style=disnake.ButtonStyle.gray, custom_id="premium"),
disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")
]
)
@bot.listen("on_button_click")
async def listener(inter: disnake.MessageInteraction):
if inter.component.custom_id == "premium":
embed = disnake.Embed(
title="Расчет выполнен",
color=0x2663F0
)
if price >= 100 and price <= 499:
price+=37
if price >= 500 and price <= 999:
price+=55
if price >= 1000 and price <= 2499:
price+=89
if price >= 2500 and price <= 4999:
price+=149
if price >= 5000 and price <= 9999:
price+=265
if price >= 10000 and price <= 19999:
price+=379
if price >= 20000:
price+=449
embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")
await inter.response.edit_message(embed=embed, components=[
disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")
]
)
Ответы (1 шт):
Вы можете сделать price атрибутом класса CreateProduct, чтобы его можно было использовать в других методах этого класса. Вот как это можно сделать:
class CreateProduct(disnake.ui.Modal):
def __init__(self):
components = [
disnake.ui.TextInput(
label="Желаемый доход",
placeholder="После вычета комиссий (в рублях)",
custom_id="price",
style=TextInputStyle.short
)
]
super().__init__(title="Расчет стоимости", components=components)
self.price = 0
async def callback(self, inter: disnake.ModalInteraction):
value = inter.text_values
self.price = int(value["price"]) / 0.72
self.price = round(self.price)
embed = disnake.Embed(
title="Расчет выполнен",
color=0x2663F0
)
embed.add_field(name="Цена товара для клиента:", value="```" + str(self.price) + " руб.```")
embed.add_field(name="Придет на карту:", value="```" + str(card) + " руб.```")
await inter.response.edit_message(embed=embed, components=[
disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
disnake.ui.Button(label="Премиум", style=disnake.ButtonStyle.gray, custom_id="premium"),
disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")
]
)
@bot.listen("on_button_click")
async def listener(inter: disnake.MessageInteraction):
if inter.component.custom_id == "premium":
embed = disnake.Embed(
title="Расчет выполнен",
color=0x2663F0
)
price = inter.message.interaction.price
if price >= 100 and price <= 499:
price+=37
if price >= 500 and price <= 999:
price+=55
if price >= 1000 and price <= 2499:
price+=89
if price >= 2500 and price <= 4999:
price+=149
if price >= 5000 and price <= 9999:
price+=265
if price >= 10000 and price <= 19999:
price+=379
if price >= 20000:
price+=449
embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")
await inter.response.edit_message(embed=embed, components=[
disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")
]
)
Обратите внимание, что в этом коде price теперь является атрибутом класса CreateProduct и доступен в любом методе этого класса. В функции listener вы можете получить доступ к price через inter.message.interaction.price. Это предполагает, что inter.message.interaction является экземпляром класса CreateProduct. Если это не так, вам нужно будет найти другой способ передать price из callback в listener.