You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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令牌")

代码说明

  1. 获取用户点击信息:在up_callback中,interaction.user包含了点击按钮的用户的所有信息,你可以直接获取用户名、ID、头像等,按需使用。
  2. View状态控制:调用interaction.view.stop()后,View的is_finished()会变为True,同时view.wait()会结束等待,后续的状态判断就能正常生效。
  3. 等待逻辑优化:用await view.wait(timeout=10)替代原来的asyncio.sleep(10),这样可以在按钮被点击时立即结束等待,不用等到10秒超时,体验更流畅。

内容的提问来源于stack exchange,提问作者bon ho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:30:09