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

Pycord中每次调用函数时生成新random.choice()的实现问题

解决Pycord中Embed图片每次发送随机切换的问题

问题根源

你当前的eDuel是全局初始化的,set_image只在程序启动时执行一次,所以不管触发多少次on_message,都会用同一张固定图片。

两种可行解决方案

方案1:每次发送前生成新的Embed实例

把创建Embed的逻辑封装成函数,每次需要发送时调用函数生成带随机图片的新Embed:

# 全局定义图片列表和生成函数
DuelSamples = ["https://pbs.twimg.com/media/COd5G_EUwAAtABd.jpg", "https://media.tenor.com/XoYV9sqXITkAAAAC/yu-gi-oh-time-to-duel.gif"]

def get_duel_embed():
    # 每次调用都创建新的Embed对象
    eDuel = discord.Embed(
        title="I challenge you to a duel!",
        description="",
        color=discord.Colour.brand_red()
    )
    # 随机选择图片URL设置
    eDuel.set_image(url=random.choice(DuelSamples))
    return eDuel

然后在on_message中替换原有的embed = eDuel:

if random.randint(1,1) == 1:
    # 调用函数获取带随机图片的Embed
    duel_embed = get_duel_embed()
    await message.channel.send(f"<@{user.id}> \n ** **", embed=duel_embed, view=DuelButton())
    player.insert(1, user.id)

方案2:复制Embed模板再修改图片

如果想复用基础Embed的配置(标题、颜色等),可以先定义一个不带图片的模板,每次发送前复制模板并设置随机图片:

# 全局定义图片列表和基础模板(不设置图片)
DuelSamples = ["https://pbs.twimg.com/media/COd5G_EUwAAtABd.jpg", "https://media.tenor.com/XoYV9sqXITkAAAAC/yu-gi-oh-time-to-duel.gif"]

eDuelTemplate = discord.Embed(
    title="I challenge you to a duel!",
    description="",
    color=discord.Colour.brand_red()
)

在on_message中修改:

if random.randint(1,1) == 1:
    # 复制模板,避免修改全局实例导致并发问题
    eDuel = eDuelTemplate.copy()
    # 设置随机图片
    eDuel.set_image(url=random.choice(DuelSamples))
    await message.channel.send(f"<@{user.id}> \n ** **", embed=eDuel, view=DuelButton())
    player.insert(1, user.id)

你之前尝试的错误说明

  • 直接把DuelSamples列表传给set_image:set_image的url参数需要单个字符串URL,必须用random.choice()从列表中选出一个具体的URL再传入。
  • 把set_image方法放进列表:set_image是Embed对象的方法,必须调用它才能生效,直接存进列表不会执行任何操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:55:18