參數選單

Choice物件

在上方引入物件與套件,方便我們操作而不需加太多前綴
不然原本須使用app_commands.Choice()這麼長一串
但引入後只需使用Choice()

1
2
from discord.app_commands import Choice
from discord import app_commands

Choice物件通常會使用兩個參數:namevalue

name是在Discord內實際使用時會顯示的名稱,value是後台取得的值,可以是字串或數字,例如

1
2
Choice(name='宇宙無敵霹靂超級棒', value='supercalifragilisticexpialidocious')
Choice(name='最高分', value=10)

基本語法

1
2
3
4
5
6
7
8
9
10
@bot.tree.command()
@app_commands.choices(
color=[
Choice(name="紅色", value="red"),
Choice(name="藍色", value="blue"), #這裡有逗號不要忘記
Choice(name="綠色", value="green")
]
)
async def choose_color(interaction: discord.Interaction, color:Choice[str]):
await interaction.response.send_message(f"你選擇的顏色是 {color.name}!")
1
2
3
4
@bot.tree.command()
@app_commands.choices(color=[Choice(name="紅色", value="red"),Choice(name="藍色", value="blue"),Choice(name="綠色", value="green")])
async def choose_color(interaction: discord.Interaction, color:Choice[str]):
await interaction.response.send_message(f"你選擇的顏色是 {color.name}!")

將選項放進參數內的做法為下:

  1. 增加裝飾器`

    在指令裝飾器下面再加一個@app_commands.choices() 記得choice是複數,有s

  2. 填寫參數名稱

    指定你想要作為選單的參數,如上圖想要把color做成選單,就把color填進剛剛新增的裝飾器內
    不要被排版迷惑,color實際上是@app_commands.choices() 的一個參數,但Python允許我們這樣換行方便閱讀

  3. 參數內容

    這個裝飾器內的參數需要是一個清單,內容是多個Choice物件,你可以像上面一樣選擇換行方便閱讀,或是直接寫成一行

    不要忘記後面有逗號

  4. 原參數指定型別

    指定原本的參數型別改成Choice[str] ,裡面的str需要跟上面Choice的value一樣,如果是數字就要改成Choice[int]

至於要使用你填入的參數,可以在函數內這樣使用

1
2
color.value # 後台接收的數值
color.name # 前台顯示的名稱

練習

讓使用者選擇三種水果,並回傳給使用者他選了什麼水果,英文是什麼
先自己試試看再看解答

1
2
3
4
5
6
7
8
9
10
@bot.tree.command()
@app_commands.choices(
fruit=[
app_commands.Choice(name="蘋果", value="banana"),
app_commands.Choice(name="香蕉", value="orange"),
app_commands.Choice(name="奇異果", value="guava"),
]
)
async def choose_color(interaction: discord.Interaction, fruit: app_commands.Choice[str]):
await interaction.response.send_message(f"你選擇的顏色是 {fruit.name},英文是{fruit.value}")

可不填的參數

1
2
3
4
5
6
@bot.tree.command()
async def speak(interaction:discord.Interaction, option:str|None):
if option:
await interaction.response.send_message(f'你說了{option}')
else:
await interaction.response.send_message('你沒有說話')

只要把類型後面加上|None 就可以了