我有一本字典,其中问题作为键,答案作为值。我想使用变量创建一个模块化选择菜单,以便能够绘制随机问题,并且菜单自动具有变量给出的正确问题和正确答案,而无需为每个问题创建选择菜单视图类
Q1 = {"Aube ou crépuscule" : {
"Aube" : {"gry" : 73, "serd" : 73, "pouf" : 30, "serp" : 26},
"Crépuscule" : {"gry" : 27, "serd" : 27, "pouf" : 70, "serp" : 74}
},
"Forêt ou rivière" : {
"Forêt" : {"gry" : 74, "serd" : 73, "pouf" : 26, "serp" : 28},
"Rivière" : {"gry" : 26, "serd" : 27, "pouf" : 74, "serp" : 72}
},
"Etoiles ou lune" : {
"Etoiles" : {"gry" : 27, "serd" : 74, "pouf" : 33, "serp" : 72},
"Lune" : {"gry" : 73, "serd" : 26, "pouf" : 67, "serp" : 28}}}
即随机问题是 Aube ou crépuscule 并选择菜单显示 Aube 和 Crépuscule
我先尝试过:
async def select_callback(self, interaction: discord.Interaction, select: discord.ui.ChannelSelect):
await interaction.response.send_message(f"Awesome! I like {select.values[0]} too!")
class MyView(discord.ui.View):
def __init__(self, interaction, question, choix):
super().__init__()
# Create the select menu
select_menu = discord.ui.Select(
custom_id="MySelect",
placeholder=question,
min_values=1,
max_values=1,
options=choix
)
select_menu.callback = select_callback(self, interaction, select_menu)
self.add_item(select_menu)
@bot.tree.command()
async def que(ctx: discord.Interaction):
numquestion = random.randint(0, len(Q1)-1)
question = list(Q1.keys())[numquestion]
lab1 = list(Q1[question].keys())[0]
lab2 = list(Q1[question].keys())[1]
choix = [
discord.SelectOption(label = lab1),
discord.SelectOption(label = lab2)
]
my_view = MyView(ctx, question, choix)
await ctx.response.send_message(question, view = my_view)
并得到
Traceback (most recent call last):
File "C:\Users\Bilbibalou\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\discord\ui\view.py", line 430, in _scheduled_task
await item.callback(interaction)
^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'coroutine' object is not callable
在我尝试之后:
class MyView(discord.ui.View):
def __init__(self, question, choix):
super().__init__()
@discord.ui.select(
placeholder = question,
min_values = 1,
max_values = 1,
options = choix
)
async def select_callback(self, interaction: discord.Interaction, select: discord.ui.ChannelSelect):
await interaction.response.send_message(f"Awesome! I like {select.values[0]} too!")
仅显示await ctx.response.send_message(question, view = my_view)的问题,而不显示选择菜单
我终于找到了这个解决方案
async def questionnaire_choixpeau(interaction : discord.Interaction, numQ : dict, id : int) :
question = list(numQ.keys())[random.randint(0, len(numQ)-1)]
option = []
for lab in list(numQ[question].keys()) :
option.append(discord.SelectOption(label = lab))
class select_questionnaire(discord.ui.View):
@discord.ui.select(
placeholder = question,
min_values = 1,
max_values = 1,
options = option
)
async def select_callback(self, ctx : discord.Interaction, select) :
score = list(numQ[question][select.values[0]].values())
cursor.execute("UPDATE maisons SET gry = gry + %s, serd = serd + %s, pouf = pouf + %s, serp = serp + %s WHERE id = %s;", (score[0], score[1], score[2], score[3], id))
conn.commit()
if numQ == Q1 :
print("Q1")
await questionnaire_choixpeau(ctx, Q2, id)
elif numQ == Q2 :
await questionnaire_choixpeau(ctx, Q3, id)
elif numQ == Q3 :
await questionnaire_choixpeau(ctx, Q4, id)
elif numQ == Q4 :
await questionnaire_choixpeau(ctx, Q5, id)
elif numQ == Q5 :
await questionnaire_choixpeau(ctx, Q6, id)
elif numQ == Q6 :
await questionnaire_choixpeau(ctx, Q7, id)
elif numQ == Q7 :
await questionnaire_choixpeau(ctx, Q8, id)
elif numQ == Q8 :
await ctx.response.edit_message(embed = None, view = None)
await attribution_maison(ctx, id)
embed = discord.Embed(title = question)
for opt in option:
embed.add_field(name = "", value = f"- {opt}", inline = False, )
if numQ == Q1 :
await interaction.response.send_message(embed = embed, view = select_questionnaire(), ephemeral = True)
else :
await interaction.response.edit_message(embed = embed, view = select_questionnaire())