discord.py如何获取视图交互信息?view.is_finished()判断失效问题
Discord.py按钮点击后
view.is_finished()不生效及获取点击信息的解决方案 问题分析
你的代码里点击按钮后view.is_finished()始终没返回True,核心原因是默认情况下按钮点击不会自动将View标记为已结束,必须手动调用view.stop()来触发这个状态变化。另外,要获取点击按钮的用户信息,直接从回调函数的interaction对象中即可获取。
修正方案
关键修改点
- 在按钮的回调函数中调用
view.stop(),让View进入finished状态,这样view.is_finished()会返回True - 通过
interaction.user直接获取点击按钮的用户信息(ID、用户名等) - 调整原有的递归调用逻辑,避免重复创建View导致的逻辑混乱
修正后的完整代码
from discord import ui, app_commands, Interaction import discord import asyncio class MyClient(discord.Client): async def on_ready(self): await self.wait_until_ready() await tree.sync() print(f"{self.user} 已上线") intents = discord.Intents.all() client = MyClient(intents=intents) tree = app_commands.CommandTree(client) @tree.command(name="auction", description="开启拍卖") async def auction(interaction:Interaction): async def up_callback(interaction:Interaction): # 获取点击按钮的用户信息 click_user = interaction.user print(f"用户 {click_user.name}(ID:{click_user.id})点击了加价按钮") # 给用户发送临时反馈 await interaction.response.send_message("已加价!", ephemeral=True) # 标记View为已结束 interaction.view.stop() async def auction_callback(): view = ui.View() up_button = ui.Button(label="加价", style=discord.ButtonStyle.green) up_button.callback = up_callback view.add_item(up_button) # 编辑初始消息,添加按钮 await interaction.edit_original_response(content="欢迎来到我的拍卖!", view=view) # 等待View结束或10秒超时(设置超时时间) await view.wait(timeout=10) # 检查View是否因点击结束 if view.is_finished(): print("按钮被点击,拍卖继续或进行下一步逻辑") # 这里可以添加拍卖继续的逻辑,比如更新价格、刷新按钮等 else: # 超时未点击,删除拍卖消息 await interaction.delete_original_response() # 先发送初始欢迎消息 await interaction.response.send_message("正在初始化拍卖...") await auction_callback() client.run("你的Bot令牌")
代码说明
- 获取用户点击信息:在
up_callback中,interaction.user包含了点击按钮的用户的所有信息,你可以直接获取用户名、ID、头像等,按需使用。 - View状态控制:调用
interaction.view.stop()后,View的is_finished()会变为True,同时view.wait()会结束等待,后续的状态判断就能正常生效。 - 等待逻辑优化:用
await view.wait(timeout=10)替代原来的asyncio.sleep(10),这样可以在按钮被点击时立即结束等待,不用等到10秒超时,体验更流畅。
内容的提问来源于stack exchange,提问作者bon ho
相关产品推荐
相关产品推荐

