參數選單
Choice物件
在上方引入物件與套件,方便我們操作而不需加太多前綴
不然原本須使用app_commands.Choice()
這麼長一串
但引入後只需使用Choice()
1 2
| from discord.app_commands import Choice from discord import app_commands
|
Choice物件通常會使用兩個參數:name
跟value
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}!")
|
將選項放進參數內的做法為下:
增加裝飾器`
在指令裝飾器下面再加一個@app_commands.choices()
記得choice是複數,有s
填寫參數名稱
指定你想要作為選單的參數,如上圖想要把color做成選單,就把color填進剛剛新增的裝飾器內
不要被排版迷惑,color實際上是@app_commands.choices()
的一個參數,但Python允許我們這樣換行方便閱讀
參數內容
這個裝飾器內的參數需要是一個清單,內容是多個Choice物件,你可以像上面一樣選擇換行方便閱讀,或是直接寫成一行
不要忘記後面有逗號
原參數指定型別
指定原本的參數型別改成Choice[str]
,裡面的str需要跟上面Choice的value一樣,如果是數字就要改成Choice[int]
至於要使用你填入的參數,可以在函數內這樣使用
練習
讓使用者選擇三種水果,並回傳給使用者他選了什麼水果,英文是什麼
先自己試試看再看解答
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
就可以了