Discord.py按钮3分钟未点击无响应,超时参数配置求助
问题描述
按钮超过3分钟未点击就会提示「interaction failed after 3 min」,无法响应操作,已知和timeout参数有关,但不知道配置位置。
解决方案
Discord.py中discord.ui.View的默认超时时间为180秒(3分钟),修改超时规则只需在View类的初始化方法中给父类传入timeout参数:
- 若要让按钮永久有效,设置
timeout=None - 若要自定义超时时长,传入具体秒数(例如1小时设为
timeout=3600)
另外注意:原代码中使用的time.sleep()是同步阻塞函数,会导致bot在休眠期间无法处理其他请求,必须替换为异步的asyncio.sleep()。
修改后的完整代码
import asyncio import json import discord # Tickets class Menu(discord.ui.View): def __init__(self): # 配置超时,这里设置为None即永久有效,可替换为具体秒数 super().__init__(timeout=None) self.value = None @discord.ui.button(label="📥 Ticket", style=discord.ButtonStyle.grey) async def menu1(self, interaction: discord.Interaction, button: discord.ui.Button): with open("open_channels_user_id.json", "r") as f: data = json.load(f) user_id = data["user_id"] if user_id != interaction.user.id: admin_role = discord.utils.get(interaction.guild.roles, name="hulpje") category = discord.utils.get(interaction.guild.categories, name='Ticket') overwrites = {interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False), interaction.guild.me: discord.PermissionOverwrite(read_messages=True), interaction.user: discord.PermissionOverwrite(read_messages=True), admin_role: discord.PermissionOverwrite(read_messages=True)} new_ticket = await interaction.guild.create_text_channel(f'Ticket- {interaction.user.name}', category=category, overwrites=overwrites) channel = interaction.guild.get_channel(new_ticket.id) embed = discord.Embed(title=f'Ticket- {interaction.user.name}', description="Goed dat je een ticket opent. \n Stuur alvast wat informatie zodat het makkelijker is voor het staff team.", color=0x004BFF) await channel.send(embed=embed) await interaction.response.send_message(f"Ticket is geopen met de naam: Ticket- {interaction.user.name}") data['user_id'] = interaction.user.id with open("open_channels_user_id.json", "w") as f: json.dump(data, f) # 替换同步sleep为异步版本,避免阻塞bot await asyncio.sleep(3) await interaction.channel.purge(limit=1) else: await interaction.response.send_message("Je hebt al een ticket openstaan.") await asyncio.sleep(5) await interaction.channel.purge(limit=1) async def menu(ctx): view = Menu() embed = discord.Embed(title="Ticket", description="Vragen, klachten of iets anders maak hier je Ticket aan en wordt zo snel mogelijk geholpen!", color=0x004BFF) await ctx.send(embed=embed, view=view)
额外提示
如果设置timeout=None,需要在bot启动时通过bot.add_view(Menu())注册该View,否则bot重启后已发送的按钮会失效。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

