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

Discord.py中如何正确获取按钮选择的返回值?

解决Discord.py按钮选择结果同步获取问题

问题分析

你的代码通过全局变量proceed存储用户按钮选择,但await channel.send是异步操作,后续的if判断会在用户点击按钮前就执行,导致无法正确获取结果。同时你希望避免将业务逻辑分散到每个按钮回调中,需要一种能直接获取选择返回值的方案。

解决方案

给自定义View类添加结果属性,利用View.wait()方法等待用户交互完成,实现同步获取选择结果,同时保持业务逻辑的集中性。

修改后的完整代码

import discord
from discord import Embed
from discord.ui import View

class Button_solve(View):
    def __init__(self):
        super().__init__(timeout=60)
        self.result = None  # 存储用户选择的结果

    @discord.ui.button(label="1", style=discord.ButtonStyle.blurple, custom_id="button1")
    async def callback_1(self, interaction, button):
        button.label += " ✅"
        # 禁用所有按钮,防止重复点击
        for item in self.children:
            item.disabled = True
        await interaction.response.edit_message(view=self)
        self.result = 1
        self.stop()  # 停止View,触发wait()结束等待

    @discord.ui.button(label="2", style=discord.ButtonStyle.green, custom_id="button2")
    async def callback_2(self, interaction, button):
        button.label += " ✅"
        for item in self.children:
            item.disabled = True
        await interaction.response.edit_message(view=self)
        self.result = 2
        self.stop()

    @discord.ui.button(label="3", style=discord.ButtonStyle.red, custom_id="button3")
    async def callback_3(self, interaction, button):
        button.label += " ✅"
        for item in self.children:
            item.disabled = True
        await interaction.response.edit_message(view=self)
        self.result = 3
        self.stop()

@client.event
async def on_ready():
    channel = client.get_channel(CHANNEL_ID)
    view = Button_solve()
    # 发送带按钮的消息
    await channel.send(embed=Embed(title="Select Button"), content="", view=view)
    # 等待用户完成选择或超时
    await view.wait()
    
    # 集中处理业务逻辑
    if view.result == 1:
        # 处理选择1的业务逻辑
        pass
    elif view.result == 2:
        # 处理选择2的业务逻辑
        pass
    elif view.result == 3:
        # 处理选择3的业务逻辑
        pass
    else:
        # 用户未选择或超时的处理逻辑
        pass

client = discord.Client(intents=discord.Intents.all())
client.run(TOKEN)

关键说明

  • 结果存储:用Button_solve类的self.result属性替代全局变量,避免全局变量的副作用。
  • 等待交互:view.wait()会异步阻塞,直到用户点击按钮触发self.stop(),或者超过设置的超时时间。
  • 禁用按钮:用户点击后禁用所有按钮,防止重复触发回调,提升交互体验。
  • 停止View:每个按钮回调中调用self.stop(),通知view.wait()结束等待,程序继续执行后续业务逻辑判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:27:17