iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
自我挑戰組

Python Discord Bot(DC機器人)系列 第 16

Python Discord Bot#16 - UI篇-Modal Dialogs對話框

  • 分享至 

  • xImage
  •  

Modal Dialogs篇

參考讀物: 官方

使用"/"觸發

class DialogModal(discord.ui.Modal):
    def __init__(self, *, timeout=180):
            super().__init__(timeout=timeout)
            self.add_item(discord.ui.InputText(label="標題"))
            self.add_item(discord.ui.InputText(label="內容", style=discord.InputTextStyle.long))
            
    async def callback(self, interaction: discord.Interaction):
            embed = discord.Embed(title=self.children[0].value)
            embed.add_field(name="內容", value=self.children[1].value)
            await interaction.response.send_message(embeds=[embed])
        
@Bot.slash_command(name="選單")
   async def click_click(ctx: discord.ApplicationContext):
    await ctx.send_modal(DialogModal(title="敲敲話"))

結果:
https://ithelp.ithome.com.tw/upload/images/20230916/20106071hknqAYBkxH.png
https://ithelp.ithome.com.tw/upload/images/20230916/20106071Gjb4Z86658.png
https://ithelp.ithome.com.tw/upload/images/20230916/20106071DZMUPOaRqr.png


此篇使用 discord.ext.commands.Bot.slash_command 註冊了 command
並在回傳時,原本

await ctx.send("回傳的文字")

變成了...

await ctx.send_modal(DialogModal(title="敲敲話"))

並且,discord.ui.Modal
使用 class 宣告內容

參數 內容
children 顯示在模式對話框中的InputText
title 對話框的標題。
custom_id 對話框的ID。
timeout 超時時間

@discord.InputText

參數 內容
style 文本樣式
custom_id 文本字段的 ID
label 文本標籤
placeholder 未選擇任何內容時顯示的文本
min_length 符號
max_length 符號
required 是否為必填
value 預設內容
row 所屬相對行數,DC組件最多五行

callback 回傳 interaction

無法使用command 觸發

在 @Bot.command 是無法直接觸發 send_modal()
因為 callback 而非 slash_command、user_command、message_command 一樣 callback為 interation
而是,ctx: commands.Context
所以無法直接嵌入Modal

但官方是能用command去觸發 前幾篇介紹的UI(Button、Select)後,得到的callback就會是interaction

@Bot.command(name="敲敲話")
    async def click_click(ctx: commands.Context):
        class MyView(discord.ui.View):
            @discord.ui.button(label="想要敲敲話", style=discord.ButtonStyle.primary)
            async def button_callback(self, button: discord.ui.Button, interaction: discord.Interaction):
                await interaction.response.send_modal(DialogModal(title="敲敲話"))

        await ctx.send(view=MyView())

https://ithelp.ithome.com.tw/upload/images/20230916/20106071eDSWEwBdJr.png


上一篇
Python Discord Bot#15 - UI篇-Select選單
下一篇
Python Discord Bot#17 - Replit介紹
系列文
Python Discord Bot(DC機器人)31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言