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
相关产品推荐
相关产品推荐

