discord.py斜杠命令:如何实现学位与班级的动态关联参数
解决discord.py斜杠命令中动态依赖参数的班级选择问题
核心问题
你需要实现一个斜杠命令,让用户先选择学位(ciclo),再根据所选学位动态显示对应的班级(clase)选项,但直接绑定枚举的写法无法实现参数依赖,导致多种报错:
clase: {Ciclos.name}/clase: Ciclos.name:触发AttributeError,因为Ciclos类本身没有name属性,name是枚举实例的专属属性clase: ciclo:触发NameError,参数定义阶段无法访问未定义的ciclo变量
解决方案
使用discord.py的**自动补全(app_commands.autocomplete)**功能,实现班级选项的动态生成,这是处理参数依赖的标准方式。
完整代码实现
import enum import discord from discord import app_commands # 学位枚举(value设为字符串,方便直接拼接文件名) class Ciclos(enum.Enum): ASIX = "ASIX" DAM = "DAM" # 各学位对应的班级枚举 class ASIXClases(enum.Enum): _1A = "1A" _1B = "1B" _1C = "1C" _2A = "2A" _2B = "2B" class DAMClases(enum.Enum): _1A = "1A" _2A = "2A" _2B = "2B" # 学位到对应班级枚举的映射表 CICLO_TO_CLASES = { Ciclos.ASIX: ASIXClases, Ciclos.DAM: DAMClases } # 班级选项自动补全函数:根据用户已选学位返回对应班级 async def clase_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]: # 从交互数据中提取用户已选择的学位值 selected_ciclo_val = interaction.data["options"][0]["value"] # 转换为枚举实例 ciclo_enum = Ciclos(selected_ciclo_val) # 获取对应学位的班级枚举 clases_enum = CICLO_TO_CLASES[ciclo_enum] # 生成匹配用户输入的选项(支持模糊匹配) return [ app_commands.Choice(name=clase.name.lstrip("_"), value=clase.value) for clase in clases_enum if current.lower() in clase.name.lower() ] @bot.tree.command(name="schedule", description="显示所选班级的课程表") @app_commands.describe(ciclo="选择你的学位", clase="选择你的班级") # 给clase参数绑定自动补全函数 @app_commands.autocomplete(clase=clase_autocomplete) async def schedule(interaction: discord.Interaction, ciclo: Ciclos, clase: str): # 拼接课程表图片路径 file_path = f"Media/schedules/schedule{ciclo.value}_{clase}.png" try: await interaction.response.send_message(file=discord.File(file_path)) except FileNotFoundError: # 发送私有消息提示文件不存在,避免刷屏 await interaction.response.send_message("找不到对应班级的课程表图片,请检查文件路径!", ephemeral=True)
关键细节说明
- 枚举结构优化:把
Ciclos的value设为字符串,直接用于文件名拼接,无需额外转换;将各学位的班级拆分为独立枚举,便于后续维护。 - 自动补全逻辑:通过
interaction.data获取用户已选择的学位,动态返回对应的班级选项,同时支持模糊匹配用户输入的内容。 - 异常处理:增加文件不存在的捕获逻辑,发送私有提示消息,提升用户体验的同时避免公共频道刷屏。
- 参数类型调整:
clase参数使用str类型,直接接收自动补全返回的班级值,简化后续拼接逻辑。
内容的提问来源于stack exchange,提问作者Nebian
相关产品推荐
相关产品推荐

