¿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?
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 instanciahelpView()
y la adición del botónsupportServerButton
después de que el bucle de eventos se inicie.Por ejemplo, podrías hacer algo como esto:
Esto debería crear la instancia de
helpView()
y agregar el botónsupportServerButton
solo después de que se haya iniciado el bucle de eventos, evitando el error “no running event loop”.