Я пытаюсь сделать команду, которая показывает вам расписание вашего класса, для этого пользователь сначала вводит в качестве аргумента его степень, а затем класс, но каждая степень имеет разное количество классов, поэтому я не могу показать общий список для всех степеней.
Фактический код:
class Ciclos(enum.Enum):
ASIX = 1
DAM = 2
class ASIX(enum.Enum):
_1A = 1
_1B = 2
_1C = 3
_2A = 4
_2B = 5
class DAM(enum.Enum):
_1A = 1
_2A = 2
_2B = 3
@bot.tree.command(name = "schedule", description = "Shows the schedule of the selected class")
@app_commands.describe(ciclo = "Choose your degree")
@app_commands.describe(clase = "Choose your class")
async def schedule(interaction: discord.Interaction, ciclo: Ciclos, clase: Ciclos.name):
await interaction.response.send_message(file=discord.File(f'Media/schedules/schedule{ciclo.name}{clase.name}.png'))
Этот код не работает, но я надеюсь, что он служит для иллюстрации того, что я пытаюсь сделать. Проблемная часть связана с параметрами функции, особенно с clase: Ciclos.name, я не знаю, как сделать так, чтобы это зависело от того, что пользователь выбирает на ciclo: Ciclos.
Я попытался поставить эти выражения:
clase: {Ciclos.name}
Я получаю -> AtributeError: имя
clase: Ciclos.name
Я получаю -> AtributeError: имя
clase: ciclo
Я получаю -> NameError: имя «цикло» не определено. Возможно, вы имели в виду: 'Ciclos'?
Нет, я не это имел в виду.
Ожидаемый результат таков:
пример класса ASIX
Пример класса DAM
Чтобы отправить изображение расписания, соответствующее каждому классу:
await interaction.response.send_message(file=discord.File(f'Media/schedules/schedule{ciclo.name}{clase.name}.png'))
Итак, я получаю имена файлов, например: "расписание ASIX_1A" "расписаниеDAM_2A"
Спасибо за разъяснение, поэтому я не смог найти ни одного примера этого, потому что это невозможно. Я попробую найти другой способ сделать это. Я бы отметил ваш ответ как самый правильный, но это комментарий.
Я добавлю это как ответ.






Извините, я не думаю, что динамические варианты встроены в API разногласий, но я обычно использую следующее, чтобы добавить варианты в команду Slash, может быть, это может вам помочь.
@app_commands.choices(
ciclo=[
app_commands.Choice(name = "ASIX", value = "ASIX"),
app_commands.Choice(name = "DAM", value = "DAM")
],
clase=[app_commands.Choice(name = "A1", value = "A1")])
Я немного изменил его, чтобы он соответствовал вашему примеру, чтобы он соответствовал вашему примеру, но, как я уже сказал, насколько я знаю, нет никакого способа сделать динамический выбор с помощью команд с косой чертой.
Спасибо за ваш ответ, ваш пример добавляет в команду более одного аргумента, а не динамический аргумент, но ваш первый абзац ответил на мой вопрос. Невозможно сделать динамический выбор. Я отмечу ваш ответ как тот, который решил проблему.
Это невозможно со стороны Discord. Варианты должны быть известны заранее и синхронизированы, чтобы они не могли динамически изменяться в зависимости от других значений (также — вы можете заполнять их в любом порядке, так что это даже не сработает).
Вам придется поступить иначе. Вы не можете ссылаться на текущее значение этого аргумента как на тип выбора.
Одним из вариантов может быть, например, использование представлений с меню выбора. Более гибридный подход может состоять в том, чтобы иметь команду косой черты с вариантами выбора и позволить этому ответу с помощью меню «Выбор» для конкретных параметров, которые они могут выбрать в зависимости от своего аргумента. Вот пример меню выбора: https://github.com/Rapptz/discord.py/blob/master/examples/views/dropdown.py
Это невозможно со стороны Discord. Выбор должен быть известен заранее и не может динамически изменяться на основе других значений (также - вы можете заполнять их в любом порядке, так что это даже не сработает). Вам придется поступить иначе. Вы не можете ссылаться на текущее значение этого аргумента как на тип выбора.