如何用discord.py创建模块化随机问题选择菜单
解决discord.py动态生成Select菜单的问题
核心实现代码
import discord from discord import ui import random # 示例问题字典,替换成你的Q1数据 Q1 = { "你最喜欢的编程语言是?": ["Python", "JavaScript", "Java", "C++"], "今天天气如何?": ["晴天", "阴天", "下雨", "下雪"] } class DynamicSelectView(ui.View): def __init__(self, question, options): super().__init__(timeout=180) # 设置菜单超时时间(秒) # 动态添加对应问题的Select组件 self.add_item(DynamicSelect(question, options)) class DynamicSelect(ui.Select): def __init__(self, question, options): # 把答案列表转成Select需要的选项格式 select_options = [discord.SelectOption(label=opt) for opt in options] super().__init__(placeholder=f"请选择「{question}」的答案", options=select_options) self.question = question async def callback(self, interaction: discord.Interaction): # 处理用户选择后的逻辑,这里示例返回选择结果 await interaction.response.send_message(f"你对「{self.question}」的答案是:{self.values[0]}", ephemeral=True) # 示例slash命令(基于discord.py 2.x框架) @bot.tree.command(name="random_question", description="随机抽取问题并展示选项菜单") async def random_question(interaction: discord.Interaction): # 随机抽取一组问题和对应选项 question, options = random.choice(list(Q1.items())) # 创建视图并附带菜单发送消息 view = DynamicSelectView(question, options) await interaction.response.send_message(f"问题:{question}", view=view)
你遇到的错误原因分析
1. "TypeError: 'coroutine' object is not callable"
这个错误几乎都是因为你把协程函数的执行结果当成回调函数传入了,比如错误写法:
# 错误示例:误将await后的协程对象传给callback,而非函数本身 ui.Select(callback=await some_coroutine())
正确做法是直接传递协程函数(比如示例中的self.callback,不要加括号调用)。
2. 仅显示问题文本,未加载菜单
常见原因有三个:
- 发送消息时遗漏了
view参数,比如只写了await interaction.response.send_message(f"问题:{question}"),没加view=view - 创建View后忘记调用
self.add_item()添加Select组件 - 使用了discord.py 1.x版本(组件API和2.x完全不同),或者View的
timeout设为0导致菜单直接失效
额外注意事项
- 确保使用discord.py 2.x版本,1.x的组件逻辑不支持这种动态创建方式
- 如果需要菜单永久有效,可将
timeout=None,但要注意内存占用 - 若需要判断答案对错,可修改Q1的结构(比如问题对应
{"correct": "答案", "options": ["选项1", ...]}),在callback里做校验
内容的提问来源于stack exchange,提问作者bilbibalou
相关产品推荐
相关产品推荐

