使用discord.py发送图片求助:绘图完成后无法发送图片
Discord机器人发送生成图片的解决方案
原代码存在的问题
- 嵌套了不必要的
send函数,直接在on_message事件里处理发送逻辑即可 - 旧版的
client.send_message已被弃用,新版Discord.py推荐使用更直接的频道发送方法 - PIL生成的Image对象不能直接传给
discord.File,需要先转成字节流或保存为本地文件 - 导入了无用的模块(
msilib.schema.File、tkinter.font),会干扰代码逻辑
修正后的完整代码
from PIL import Image, ImageDraw, ImageFont import discord from io import BytesIO @client.event async def on_message(message): # 跳过机器人自身消息,避免触发循环 if message.author == client.user: return username = str(message.author).split('#')[0] user_message = str(message.content) channel = str(message.channel.name) print(f'{username}: {user_message}({channel})') if username == "ChrisMightShootYou": # 用原始字符串避免路径转义问题 font = ImageFont.truetype(font=r'D:\DOWNLOAD\DiscordBot\FuturaBookFont.ttf', size=84) image = Image.open(r'D:\DOWNLOAD\DiscordBot\erdemoji.png') draw = ImageDraw.Draw(im=image) draw.text(xy=(340, 50), text=user_message, font=font, fill='white', anchor='mm', stroke_width=4, stroke_fill='black') # 将图片转为字节流,无需保存到本地 img_bytes = BytesIO() image.save(img_bytes, format='PNG') img_bytes.seek(0) # 重置字节流指针到开头 # 直接发送到当前消息所在频道 await message.channel.send(file=discord.File(img_bytes, filename='custom_image.png'))
关键修改说明
- 移除无用导入:删掉了
msilib.schema.File和tkinter.font,添加BytesIO用于处理图片字节流 - 避免消息循环:增加判断跳过机器人自己发送的消息
- 路径处理优化:用原始字符串定义文件路径,防止反斜杠转义出错
- 图片流处理:通过
BytesIO将PIL生成的图片转为字节流,无需生成本地临时文件,更高效 - 发送逻辑简化:使用
message.channel.send()直接发送到当前频道,无需手动获取频道ID
备选方案(保存本地文件发送)
如果不想用字节流,也可以先保存图片到本地再发送:
# 替换字节流相关代码 image.save('temp_custom_image.png') await message.channel.send(file=discord.File('temp_custom_image.png'))
内容的提问来源于stack exchange,提问作者Chrisus
相关产品推荐
相关产品推荐

