Я пытаюсь создать с помощью Discord.Py несколько кнопок, на которых меняются метки. Я создал discord.ui.View
, а внутри него есть __init__
, который принимает значения name
и id
. Когда я вызываю class
и добавляю точку останова, я вижу, что значения присвоены self.modelName
и self.modelId
, однако сгенерированная кнопка полностью игнорирует эти значения и использует значения по умолчанию.
Мой класс определяется следующим образом:
class AlphaStrikeCardButtons(discord.ui.View):
modelName = "supernova 2"
modelId = "3133"
#defining constructor
def __init__(self,name,id):
super().__init__()
self.modelName = name
self.modelId = f'asc{id}'
@discord.ui.button(label=modelName, custom_id=modelId, style=discord.ButtonStyle.blurple)
#@discord.ui.button(label='supernova 5', custom_id='asc8132', style=discord.ButtonStyle.blurple)
async def alphaStrikeCard(self, interaction: discord.Interaction, button: discord.ui.Button):
cardPath = f'./tmp/asc{modelId}.png' #If it already exists, we don't need to download it again
if os.path.isfile(cardPath) == False:
cardUrl = f'http://masterunitlist.info/Unit/Card/{self.modelId}'
print(cardUrl)
urlretrieve(cardUrl,cardPath)
cardFile = discord.File(cardPath,filename=f'{self.modelId}.png')
await interaction.response.send_message(file=cardFile, ephemeral=False)
self.stop()
Затем я вызываю класс, используя:
ASCB = AlphaStrikeCardButtons(name=modelName,id=modelId)
await interaction.response.send_message("Please click the button:",ephemeral=True,view=ASCB)
Значения modelName
и modelId
— 'Supernova 5'
и '8132'
, однако на кнопке отображается «Сверхновая 2» и отображается custom_id
из asc3133
, что является значением по умолчанию. Я подтвердил, что значения назначены, добавив точку останова и наведя курсор на переменную:
Вы можете ясно видеть, что self.modelName
имеет значение Supernova 5
; так что это было правильно назначено.
Если я не присваиваю значения (назначаю None
) modelName
и modelId
в начале, то при вызове класса я получаю еще более запутанную ошибку:
В data.comComponents.0.comComponents.0.label: это поле является обязательным.
Итак, он говорит, что я даже не передаю значение, но я наверняка это делаю.
Почему Python игнорирует значения, установленные для переменных modelName
и modelId
, когда я подтвердил, что значения присваиваются, и как мне гарантировать, что Python использует переданные значения?
Это переменные класса:
class AlphaStrikeCardButtons(discord.ui.View):
modelName = "supernova 2"
modelId = "3133"
и это переменные экземпляра:
class AlphaStrikeCardButtons(discord.ui.View):
def __init__(self, name, id):
self.modelName = name
self.modelId = f'asc{id}'
Вы определяете переменные экземпляра и класса с одним и тем же именем, что, похоже, не входит в ваши намерения.
Аргументы, которые вы предоставляете (label=modelName, custom_id=modelId
) декоратору кнопки (@discord.ui.button
), относятся к переменным класса, которые объясняют поведение и почему вы получаете ошибку, если вы их удалите.
Обратите внимание, что вы не можете просто поставить self.
перед этими аргументами. Поскольку декоратор — это просто синтаксический сахар вокруг функции, вы не можете ссылаться на self
в переданных ему аргументах, поскольку объект, на который ссылается self
, не существует во время определения функции.
Я не знаком с библиотекой discordpy
, но похоже, что вы можете использовать конструктор Button
, чтобы инициализировать ее нужными значениями, а затем прикрепить ее к своему компоненту, вместо того, чтобы использовать декоратор - документация
Редактировать: этот плакат, похоже, пытался сделать что-то подобное; посмотри комментарии к ответу
Хорошо, в конечном итоге это привело к проблеме XY; хотя это направило меня в правильном направлении. Я мог бы потратить время на публикацию вопроса, на который я ответил сам (для X), если не найду там дубликата вопроса.
Я не знаком с этой библиотекой, поэтому я ссылаюсь только на документацию... вместо использования декоратора @discord.ui.button
создайте экземпляр кнопки с помощью my_button = discord.ui.Button(label=modelName, custom_id=modelId)
, а затем прикрепите его к своему компоненту.
@Mogo блестящая ссылка! :) Могу поспорить, что есть несколько способов добиться того, чего вы хотите.
«Вы не должны иметь переменные экземпляра и класса с одинаковым именем», вы можете, если понимаете, что это значит, и это то, что вы хотите.
@juanpa.arrivillaga спасибо за указание на это, я скорректировал формулировку, чтобы не вводить в заблуждение будущих посетителей.
Хорошо, это объясняет, почему, однако вы говорите, что я также не могу использовать
self.
, так как мне передать эти значения?