Discord嵌入编辑系统两处功能异常问题排查求助
报错信息
2023-11-01 20:00:18 ERROR discord.ui.view Ignoring exception in view <MainView timeout=180.0 children=4> for item <Button style=<ButtonStyle.secondary: 2> url=None disabled=False label='Edit Footer' emoji=None row=None> Traceback (most recent call last): File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ui\view.py", line 427, in _scheduled_task await item.callback(interaction) File "c:\Users\trace\Desktop\MU LFG\lfg bot\main.py", line 181, in edit_footer await interaction.response.send_modal(footer(original_embed=interaction.message.embeds[0])) File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\interactions.py", line 972, in send_modal await adapter.create_interaction_response( File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\webhook\async_.py", line 151, in request to_send = utils._to_json(payload) File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\utils.py", line 650, in _to_json return json.dumps(obj, separators=(',', ':'), ensure_ascii=True) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 238, in dumps **kw).encode(obj) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 257, in iterencode return _iterencode(o, 0) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 179, in default raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type datetime is not JSON serializable
问题原因
在footer模态框的__init__方法里,直接将original_embed.timestamp(datetime对象)赋值给self.time.default。而Discord模态框的TextInput组件要求default是字符串类型,发送模态框时需要序列化数据,datetime对象无法被JSON序列化,导致报错。另外初始化时的判断条件if original_embed.footer:逻辑错误,会导致无Footer的Embed无法设置Timestamp默认值。
修复方案
修改footer类的初始化方法,将Timestamp状态转为字符串:
def __init__(self, original_embed: discord.Embed): super().__init__() # 设置Footer文本和图标默认值 if original_embed.footer: self.ftext.default = original_embed.footer.text self.fticon.default = original_embed.footer.icon_url # 根据是否存在timestamp设置Yes/No默认值 self.time.default = "Yes" if original_embed.timestamp else "No"
存储疑问解答
只存储Embed名称完全不够。要持久化Embed数据,应该用discord.Embed.to_dict()把Embed转成字典,再保存到JSON文件;加载时用discord.Embed.from_dict()从字典还原,这样能完整保留所有属性(Timestamp、颜色、Footer等),避免编辑时丢失信息。
问题2:Embed颜色编辑失败
报错信息
2023-11-01 20:17:15 ERROR discord.ui.modal Ignoring exception in modal <general timeout=None children=3>: Traceback (most recent call last): File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ui\modal.py", line 188, in _scheduled_task await self.on_submit(interaction) File "c:\Users\trace\Desktop\MU LFG\lfg bot\main.py", line 159, in on_submit embed.color = discord.Color.from_str(your_hex) File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\colour.py", line 199, in from_str if value[0] == '#': TypeError: 'TextInput' object is not subscriptable
问题原因
- 错误传递对象:
your_hex = self.hex_color直接赋值了TextInput组件对象,而非输入值self.hex_color.value,导致from_str无法处理。 - 初始化判断错误:用
if original_embed.footer:判断Footer存在性,而非颜色,导致颜色默认值无法正确设置。 - 颜色格式错误:
original_embed.color.value是整数,直接赋值给hex_color.default会显示为整数,不符合用户输入的十六进制格式。
修复方案
修改general类的初始化和提交方法:
class general(ui.Modal,title="edit general info"): embed_title = ui.TextInput(label="edit title",placeholder="life",style=discord.TextStyle.long,required=False) embed_description = ui.TextInput(label="edit description",placeholder="life",style=discord.TextStyle.long,required=False) hex_color = ui.TextInput(label="edit hex color code",placeholder="#000fff",style=discord.TextStyle.short,required=False) def __init__(self, original_embed: discord.Embed): super().__init__() # 设置标题和描述默认值 self.embed_title.default = original_embed.title or "" self.embed_description.default = original_embed.description or "" # 将整数颜色值转为带#的十六进制字符串 if original_embed.color: self.hex_color.default = f"#{original_embed.color.value:06x}" else: self.hex_color.default = "" async def on_submit(self, interaction:discord.Interaction): embed = interaction.message.embeds[0] # 更新标题 if self.embed_title.value.strip(): embed.title = self.embed_title.value.strip() # 更新描述 if self.embed_description.value.strip(): embed.description = self.embed_description.value.strip() # 更新颜色 if self.hex_color.value.strip(): try: embed.color = discord.Color.from_str(self.hex_color.value.strip()) except ValueError: await interaction.response.send_message("无效的十六进制颜色代码!", ephemeral=True) return else: embed.color = None # 保存修改 await interaction.response.edit_message(embed=embed)
颜色编辑疑问解答
Discord完全支持编辑Embed颜色。只要传递正确的十六进制字符串(如#ff0000),通过discord.Color.from_str()转成Color对象后赋值给embed.color即可,上面的修复方案已处理输入值获取、格式转换和错误处理,能正常实现颜色编辑功能。
内容的提问来源于stack exchange,提问作者Janicooking
相关产品推荐
相关产品推荐

