You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pycord框架下基于用户选项选择动态调整Slash命令自动补全的技术咨询

实现Pycord Slash命令的动态自动补全

嘿,我完全懂你现在的困扰——想在Pycord里做那种根据用户之前选的选项动态调整自动补全内容的功能,官方文档要么太零散要么讲得太抽象,找不到靠谱的教程确实头疼。别担心,我给你一步步拆解,用实际代码例子帮你搞懂。

先搞懂基础:静态自动补全

先从最简单的静态补全入手,帮你熟悉Pycord的自动补全机制,再过渡到动态的。比如一个选择水果的命令:

import discord
from discord import slash_command, Option

bot = discord.Bot()

@slash_command(name="pick_fruit", description="选一种你喜欢的水果")
async def pick_fruit(
    ctx,
    fruit: Option(str, description="选择水果", autocomplete=True)
):
    await ctx.respond(f"你选了{fruit}!")

# 静态自动补全函数
@pick_fruit.autocomplete("fruit")
async def fruit_autocomplete(ctx, value: str):
    # 这里返回固定的补全选项列表
    fruits = ["苹果", "香蕉", "橙子", "草莓"]
    # 可以根据用户输入的value过滤(比如用户打了"苹",只返回苹果)
    return [f for f in fruits if value.lower() in f.lower()]

bot.run("你的Bot令牌")

这个例子里,fruit选项的补全是固定的列表,接下来我们升级成依赖其他选项的动态补全。

核心:根据前置选项动态生成补全

假设我们做一个命令:先让用户选「分类」(水果/蔬菜),然后第二个选项「物品」的补全列表会根据选的分类自动变化。关键在于:自动补全函数可以接收前面已经被用户选择的选项值。

看完整代码:

import discord
from discord import slash_command, Option, OptionChoice

bot = discord.Bot()

# 先定义分类对应的物品映射
category_items = {
    "水果": ["苹果", "香蕉", "橙子", "草莓"],
    "蔬菜": ["白菜", "胡萝卜", "西兰花", "番茄"]
}

@slash_command(name="pick_item", description="从分类里选物品")
async def pick_item(
    ctx,
    category: Option(str, description="选择分类", choices=[
        OptionChoice(name="水果", value="水果"),
        OptionChoice(name="蔬菜", value="蔬菜")
    ]),
    item: Option(str, description="选择物品", autocomplete=True)
):
    await ctx.respond(f"你选了{category}里的{item}!")

# 动态自动补全函数:接收category参数(用户已经选的分类)
@pick_item.autocomplete("item")
async def item_autocomplete(ctx, value: str, category: str):
    # 如果用户还没选分类(理论上因为category是必填项,不会出现,但保险起见)
    if not category:
        return ["请先选择分类"]
    
    # 根据分类获取对应的物品列表
    items = category_items.get(category, [])
    # 同样可以根据用户输入的value过滤结果
    filtered_items = [item for item in items if value.lower() in item.lower()]
    
    # 返回补全选项(可以直接返回字符串列表,或者用OptionChoice更规范)
    return [OptionChoice(name=item, value=item) for item in filtered_items]

bot.run("你的Bot令牌")

关键细节解释:

  1. 参数传递:在item_autocomplete函数里,我们加了category: str参数——Pycord会自动把用户已经选择的category选项的值传递给这个参数,这就是动态补全的核心!
  2. 分类映射:用字典category_items存不同分类对应的物品,这样后续扩展分类只需要修改字典,不用改太多代码。
  3. 过滤用户输入:value参数是用户当前在item选项里输入的内容,我们可以用它过滤补全列表,让补全更智能。
  4. OptionChoice的使用:返回OptionChoice可以让Discord显示更友好的名称(比如名称和值可以不一样,比如OptionChoice(name="红苹果", value="red_apple")),如果不需要的话直接返回字符串列表也可以。

常见问题排查

  • 如果发现补全没生效:检查自动补全函数的名称是否和选项名对应,参数是否正确接收前置选项(注意参数名要和命令里的选项名完全一致)。
  • 如果前置选项是可选的:那自动补全函数里要处理category为None的情况,比如返回一个提示或者空列表。
  • 调试技巧:可以在自动补全函数里加print(category, value),看看Pycord有没有正确传递参数,方便定位问题。

这样一步步来,你就能实现那种根据用户选择动态调整补全的功能啦,比看官方文档直观多了。

内容的提问来源于stack exchange,提问作者Seyedmahdi moosavyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:27:38