es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo agrego un botón de URL a una subclase de vista en Pycord?

Tengo un comando de ayuda en mi bot de Pycord que muestra una lista de comandos. Este es el embed para mostrarlo:

helpEmbed = discord.Embed(title='BlazingBot Help', description='Hola, soy un bot creado por BlazingLeaf#3982, pero aún no puedo hacer mucho porque estoy en desarrollo')

Esta es la subclase de la vista (cuando el usuario hace clic en el botón de Comandos, cambia a un embed y vista diferente):

class helpView(View):
  @discord.ui.button(label='Comandos', style=discord.ButtonStyle.green)
  async def command_callback(self, button, interaction):
    await interaction.response.edit_message(embed=commandEmbed, view=commandView())

Luego tengo el comando de barra (slash command):

@bot.slash_command(name='help', description='¡Muestra una lista de comandos y obtén un enlace al servidor de soporte!', guild_ids=[861826763570151424])
async def help(ctx):
  await ctx.interaction.response.send_message(embed=helpEmbed, view=helpView())

Y esto funciona bien, pero también quiero agregar un botón de URL que conduzca al servidor de soporte de mi bot. Revisé la API y menciona que no se puede crear un botón de URL con el decorador @discord.ui.button y que debes crear un botón manualmente. Entonces agregué este código antes del comando de barra y después de la subclase de vista:

supportServerButton = Button(label='Servidor de Soporte', style=discord.ButtonStyle.gray, url='https://discord.com')
helpView().add_item(supportServerButton)

Sin embargo, obtengo este error:

loop = asyncio.get_running_loop()
RuntimeError: no running event loop

¿Cómo puedo solucionar esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error “no running event loop” ocurre porque el bucle de eventos no está en ejecución cuando se crea la instancia helpView(). Para solucionar esto, mueve la creación de la instancia helpView() y la adición del botón supportServerButton después de que el bucle de eventos se inicie.

    Por ejemplo, podrías hacer algo como esto:

    # Crear el comando de ayuda y la vista
    helpEmbed = discord.Embed(title='BlazingBot Help', description='Hola, soy un bot creado por BlazingLeaf#3982, pero aún no puedo hacer mucho porque todavía estoy en desarrollo')
    class helpView(View):
        @discord.ui.button(label='Comandos', style=discord.ButtonStyle.green)
        async def command_callback(self, button, interaction):
            await interaction.response.edit_message(embed=commandEmbed, view=commandView())
    
    # Crear el botón manualmente
    supportServerButton = Button(label='Servidor de Soporte', style=discord.ButtonStyle.gray, url='https://discord.com')
    
    @bot.slash_command(name='help', description='¡Muestra una lista de comandos y obtén un enlace al servidor de soporte!', guild_ids=[861826763570151424])
    async def help(ctx):
        # Crear la vista después de iniciar el bucle de eventos
        help_view = helpView()
        help_view.add_item(supportServerButton)
        await ctx.interaction.response.send_message(embed=helpEmbed, view=help_view)
    

    Esto debería crear la instancia de helpView() y agregar el botón supportServerButton solo después de que se haya iniciado el bucle de eventos, evitando el error “no running event loop”.

Comments are closed.