discord.py:为随机生成的每个Embed配置专属图片的问题
解决Discord机器人随机Embed绑定专属图片的问题
核心思路
将每个Embed的标题与对应专属图片URL绑定,可通过两种方式实现:要么预先创建好带图片的Embed实例,要么用数据结构存储配置后动态生成Embed,两种方案都能解决你的问题。
方案1:预先创建带图片的Embed列表
直接在定义items时给每个Embed调用set_image()方法绑定专属图片,原代码的随机逻辑基本无需改动:
import random import discord from discord.ext import commands view = None randomitem = None @bot.command() async def testing(ctx): global randomitem # 预先创建带专属图片的Embed实例 items = [ discord.Embed(title="test1").set_image(url="https://example.com/image1.png"), discord.Embed(title="test2").set_image(url="https://example.com/image2.png"), discord.Embed(title="test3").set_image(url="https://example.com/image3.png"), discord.Embed(title="test4").set_image(url="https://example.com/image4.png"), ] randomitem = random.choice(items) global view view = discord.ui.View() button = discord.ui.Button(label="!test", custom_id="!test", style=discord.ButtonStyle.blurple) view.add_item(button) msg = await ctx.reply("Drawing a card...", embed=randomitem, view=view) async def button_callback(interaction): global randomitem try: await interaction.response.defer() except: pass next_embed = random.choice(items) while next_embed == randomitem: next_embed = random.choice(items) randomitem = next_embed await msg.reply("Drawing a card...", embed=next_embed, view=view) button.callback = button_callback
方案2:用配置结构存储,动态生成Embed(更易维护)
如果后续需要给Embed添加更多属性(比如描述、颜色),这种方式扩展性更强:
import random import discord from discord.ext import commands view = None randomitem = None @bot.command() async def testing(ctx): global randomitem # 用字典存储每个Embed的配置项:标题+专属图片URL embed_configs = [ {"title": "test1", "image_url": "https://example.com/image1.png"}, {"title": "test2", "image_url": "https://example.com/image2.png"}, {"title": "test3", "image_url": "https://example.com/image3.png"}, {"title": "test4", "image_url": "https://example.com/image4.png"}, ] # 随机选择配置并生成带图片的Embed selected_config = random.choice(embed_configs) randomitem = discord.Embed(title=selected_config["title"]).set_image(url=selected_config["image_url"]) global view view = discord.ui.View() button = discord.ui.Button(label="!test", custom_id="!test", style=discord.ButtonStyle.blurple) view.add_item(button) msg = await ctx.reply("Drawing a card...", embed=randomitem, view=view) async def button_callback(interaction): global randomitem try: await interaction.response.defer() except: pass # 随机选择与当前不同的配置 next_config = random.choice(embed_configs) while next_config["title"] == randomitem.title: next_config = random.choice(embed_configs) # 生成新的带图片Embed randomitem = discord.Embed(title=next_config["title"]).set_image(url=next_config["image_url"]) await msg.reply("Drawing a card...", embed=randomitem, view=view) button.callback = button_callback
注意事项
- 图片URL必须是Discord可直接抓取的公开链接,不能用本地文件或需要登录权限的链接
- 若要设置Embed缩略图,替换为
set_thumbnail()方法即可,用法与set_image()一致
内容的提问来源于stack exchange,提问作者Anonymouspls
相关产品推荐
相关产品推荐

