我向用户发送一个模态并期望用户的响应,收到它后,对其进行处理并接收一个列表(列表中的元素不超过 20 个),并且还向用户发送一个带有选择的选择从这个列表中。我收到此错误:
for character in character_in_raid ['name']]
^^^^^^^^^^^^^^^^^
NameError: name 'character_in_raid' is not defined
这是我当前的代码:
class logs_input(discord.ui.Modal, title="Test"):
tst = discord.ui.TextInput(label="1")
async def on_submit(self, interaction: discord.Interaction):
log_code = self.tst.value
response = get_token()
store_token(response)
log_parse = get_logs.log_character(log_code)
global character_in_raid
character_in_raid = log_parse['rankedCharacters']
for character in character_in_raid:
print(character)
await interaction.response.send_message(view=Select_buyer())
class Select_buyer(discord.ui.View):
@discord.ui.select(
placeholder = "Choose buyer",
min_values=0, max_values=20,
options= [discord.SelectOption
(label=character['name'], value=character['name'])
for character in character_in_raid ['name']]
)
async def buyer_select(self, interaction: discord.Interaction, select: discord.ui.Select):
selected_values = select.values
print(selected_values)
await interaction.response.send_message(selected_values)
我尝试将变量设置为全局变量,但没有帮助。谁能帮我这个?我将不胜感激任何指导。提前致谢!
问题在于尝试在定义
Select_buyer
类的代码运行时访问
character_in_raid
变量,但该变量是在稍后创建
Select_buyer
类的实例时才设置的。
以下是解决此问题的方法:
-
将
character_in_raid
作为参数传递给Select_buyer
类 ,并在Select
选项中使用该参数。
class logs_input(discord.ui.Modal, title="Test"):
# ... (your existing code) ...
async def on_submit(self, interaction: discord.Interaction):
# ... (your existing code) ...
view = Select_buyer(character_in_raid) # Pass the list to the view
await interaction.response.send_message(view=view)
class Select_buyer(discord.ui.View):
def __init__(self, character_list, *args, **kwargs):
super().__init__(*args, **kwargs)
self.character_list = character_list # Store the list
# Create select options dynamically
options = [discord.SelectOption(label=char['name'], value=char['name'])
for char in self.character_list]
self.buyer_select.options = options # Assign options to the select
@discord.ui.select(
placeholder="Choose buyer",
min_values=0, max_values=20,
)
async def buyer_select(self, interaction: discord.Interaction, select: discord.ui.Select):
selected_values = select.values
print(selected_values)
await interaction.response.send_message(selected_values)
在此解决方案中:
-
我们将
character_in_raid
作为参数传递给Select_buyer
的__init__
方法。 -
在
__init__
方法中,我们将传递的列表存储在self.character_list
中。 -
然后,我们在
__init__
方法中创建SelectOption
列表,并使用self.character_list
填充它。 -
最后,我们将创建的选项列表分配给
self.buyer_select.options
。 -
在
buyer_select
回调函数中访问character_in_raid
,因为它在交互发生时可用。
class logs_input(discord.ui.Modal, title="Test"):
# ... (your existing code) ...
class Select_buyer(discord.ui.View):
@discord.ui.select(
placeholder = "Choose buyer",
min_values=0, max_values=20,
)
async def buyer_select(self, interaction: discord.Interaction, select: discord.ui.Select):
# Access the character_in_raid list from the logs_input instance
character_in_raid = interaction.client.get_application().get_modal("Test").character_in_raid
# Create options dynamically using the retrieved list
options = [discord.SelectOption(label=char['name'], value=char['name'])
for char in character_in_raid]
select.options = options # Update the select options
selected_values = select.values
print(selected_values)
await interaction.response.send_message(selected_values)
在此解决方案中:
-
我们在
buyer_select
回调函数中访问character_in_raid
。 -
我们使用
interaction.client.get_application().get_modal("Test").character_in_raid
从logs_input
实例获取character_in_raid
列表。 -
然后,我们像以前一样创建
SelectOption
列表,并使用检索到的列表填充它。 -
最后,我们使用新的选项列表更新
select.options
。
这两种方法都可以解决的问题。 选择最适合的解决方案取决于的代码结构和个人喜好。
标签:python,discord.py From: 78846808