如何使用discord.py在python中创建模块化选择菜单

问题描述 投票:0回答:1

我有一本字典,其中问题作为键,答案作为值。我想使用变量创建一个模块化选择菜单,以便能够绘制随机问题,并且菜单自动具有变量给出的正确问题和正确答案,而无需为每个问题创建选择菜单视图类

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)的问题,而不显示选择菜单

python python-3.x discord.py
1个回答
0
投票

我终于找到了这个解决方案

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())
© www.soinside.com 2019 - 2024. All rights reserved.