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

如何使用Pycord存储Modal字段值(关闭后保留至提交)?

在Pycord中保留模态框字段值的实现方案

由于Discord API本身不提供模态框关闭事件,也不会实时同步用户输入内容,我们只能通过持久化存储用户提交过的内容,让用户下次打开模态框时自动填充之前的输入。以下是具体实现步骤:

1. 初始化存储容器

在bot实例化后,添加一个全局字典用于保存每个用户的模态框数据:

import discord
import pytz

bot = discord.Bot()
# 存储用户模态框数据:键为用户ID(int),值为包含输入字段的字典
bot.user_modal_data = {}

2. 修改Modal类,支持默认值填充

修改MyModal3类,在初始化时接收默认值并设置给输入框,同时在提交时更新存储:

class MyModal3(discord.ui.Modal):
    def __init__(self, default_dias="", default_motivo="") -> None:
        super().__init__(title="Comunicado de Ausência")
      
        # 第一个输入框:设置默认值
        self.add_item(discord.ui.InputText(
            label="Quantos dias ficará ausente?", 
            placeholder="Digite aqui", 
            style=discord.InputTextStyle.long, 
            min_length=2, 
            max_length=100,
            default=default_dias
        ))
        # 第二个输入框:设置默认值
        self.add_item(discord.ui.InputText(
            label="Digite o motivo:", 
            placeholder="Digite aqui", 
            style=discord.InputTextStyle.long, 
            min_length=10, 
            max_length=100,
            default=default_motivo
        ))
        

    async def callback(self, interaction: discord.Interaction):
        # 获取当前用户输入的内容
        dias_input = self.children[0].value
        motivo_input = self.children[1].value
        
        # 将输入内容保存到全局存储中
        bot.user_modal_data[interaction.user.id] = {
            "dias": dias_input,
            "motivo": motivo_input
        }
        
        # 生成并发送嵌入消息
        embed = discord.Embed(title="Registro de Ausência 🗒️", color=discord.Color.blurple())
        embed.add_field(name="👮 | Registrado por:", value=interaction.user.mention, inline=False)
        embed.add_field(name="```🗓️ | Dias ausente:```", value=dias_input, inline=False)
        embed.add_field(name="```📋| Motivo:```", value=motivo_input, inline=False)
        embed.set_thumbnail(url=interaction.user.avatar.url)
    
        channel = bot.get_channel(1161789446262378566)
        await channel.send(embed=embed)
        # 给用户发送提交成功的反馈
        await interaction.response.send_message("Registro salvo com sucesso!", ephemeral=True)

3. 修改Slash命令,加载用户历史数据

在打开模态框前,先从存储中读取用户之前提交的数据,作为默认值传入Modal:

brasilia = pytz.timezone('America/Sao_Paulo')

@bot.slash_command(guild_ids=servers, name="ausência", description="Utilize este comando para registrar os dias que ficará ausente.")
async def ausencia(ctx):
    # 获取用户历史数据,无数据则用空字符串
    user_history = bot.user_modal_data.get(ctx.author.id, {"dias": "", "motivo": ""})
    # 初始化模态框并传入默认值
    modal = MyModal3(default_dias=user_history["dias"], default_motivo=user_history["motivo"])
    await ctx.interaction.response.send_modal(modal)

注意事项

  • 这种方式只能保存用户提交过的内容,如果用户输入内容后未提交就关闭模态框,临时输入的内容无法被保存(Discord API不提供此类事件)。
  • 上述存储是内存级的,重启bot后数据会丢失。如果需要持久化保存,可以改用数据库(如SQLite、MongoDB)或本地文件存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:53:10