python Discord.py 将变量传递到模式中以用于on_submit()

atmip9wb  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(137)

我写了一个不和谐的机器人,提出了一个意见的命令“!send_view”。此视图将有3个按钮,每个角色一个。当用户点击一个按钮时,会弹出一个请求响应的模态。一旦用户提交了他们的响应,模型就会为他们分配他们选择的角色。它还向数据库中插入一条新记录以存储有关交互的信息。我想把额外的变量(比如角色ID)传递到模态类中,这样它就可以在“on_submit()”方法中使用。
到目前为止,我的工作代码是:

import discord
from discord.ext import commands
from discord import ui # modals

intents = discord.Intents.default()
intents.members = True # required for removing roles
intents.message_content = True # required for slash commands

# create connection
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event # decorator
async def on_ready():
    bot.add_view(ViewAllianceSelection())
    await bot.tree.sync()

# views
class ViewAllianceSelection(discord.ui.View):
    def __init__(self):
        super().__init__(timeout = None)
    @discord.ui.button(label = "test", custom_id = "Role 1", style = discord.ButtonStyle.green)
    async def test(self, interaction: discord.Interaction, button:discord.Button):
        await interaction.response.send_modal(ModalApplicationForm())

# modals
class ModalApplicationForm(discord.ui.Modal, title='Alliance Application Form'):

    submittedUN = ui.TextInput(label='Enter your username.', style=discord.TextStyle.short)
    async def on_submit(self, interaction: discord.Interaction):
        print('add the information to database')
        await interaction.response.send_message(f'Thank you **{self.submittedUN}**, your application has been submitted.', ephemeral=True)        

@bot.command()
async def send_view(ctx):
    embed = discord.Embed(
        title='this is a test'
    )
    await ctx.send(embed=embed, view=ViewAllianceSelection())

bot.run('my token')

为了将变量传递到on_submit()中,我尝试执行以下操作,但出现错误:

async def test(self, interaction: discord.Interaction, button:discord.Button):
        await interaction.response.send_modal(ModalApplicationForm(var='abc')) # variable to pass into modal

# modals
class ModalApplicationForm(discord.ui.Modal, title='Alliance Application Form'):
    def __init__(self, var):
        self.var = var # init variable
        print(var)
    submittedUN = ui.TextInput(label='Enter your travian username.', style=discord.TextStyle.short)
    async def on_submit(self, interaction: discord.Interaction):
    print('add the information to database')

我得到的错误是:
属性错误:“ModalApplicationForm”对象没有属性“custom_id”
我对使用类非常陌生,并且正在努力找到我想要做的事情的解决方案。任何帮助或想法将不胜感激。

vfhzx4xs

vfhzx4xs1#

请注意,您需要从discord.ui.Modal调用__init__方法来准备模型。
在第一段代码中使用ModalApplicationForm()时,调用的是类层次结构中最近的__init__方法。由于您没有在ModalApplicationForm类中定义__init__方法,因此将调用超类(discord.ui.Modal)的__init__方法。
在第二段代码中,由于为ModalApplicationForm定义了__init__方法,因此在使用ModalApplicationForm()时将调用该方法。
在这个场景中,要初始化超类,需要显式调用super().__init__()

# modals
class ModalApplicationForm(discord.ui.Modal):
    submitted_un = ui.TextInput(
        label='Enter your travian username.',
        style=discord.TextStyle.short
    )

    def __init__(self, var):
        self.var = var
        super().__init__(title='Alliance Application Form')

    async def on_submit(self, interaction: discord.Interaction):
        print(self.var)

相关问题