Discord Python v2.0:如何在选择菜单中实现预选中
实现Discord Bot选择菜单启动时预选中JSON对应选项
步骤1:确认JSON数据结构
先确保你的streamplan.json结构能直接对应周一的状态,示例结构如下:
{ "monday": "online" }
这里monday的字段值要和选择菜单选项的value完全匹配(比如"online"、"offline"、"maybe")。
步骤2:加载JSON数据
在Bot启动阶段读取JSON文件,把状态值存储下来供后续使用:
import json import discord from discord.ui import Select, View # 加载streamplan数据 try: with open("streamplan.json", "r", encoding="utf-8") as f: stream_plan = json.load(f) except FileNotFoundError: # 处理文件不存在的情况,默认初始化状态 stream_plan = {"monday": "offline"}
步骤3:创建选择菜单时设置预选中项
定义Select组件时,遍历选项并根据JSON中的状态设置default=True:
class MondaySelect(Select): def __init__(self): # 获取JSON中保存的周一状态 monday_status = stream_plan.get("monday", "offline") # 构建选项,同时标记默认选中项 options = [ discord.SelectOption(label="在线", value="online", default=(monday_status == "online")), discord.SelectOption(label="离线", value="offline", default=(monday_status == "offline")), discord.SelectOption(label="可能", value="maybe", default=(monday_status == "maybe")) ] super().__init__(placeholder="选择周一状态...", options=options) # 可选:添加选择后的回调逻辑,更新JSON数据 async def callback(self, interaction: discord.Interaction): stream_plan["monday"] = self.values[0] with open("streamplan.json", "w", encoding="utf-8") as f: json.dump(stream_plan, f, indent=2) await interaction.response.send_message(f"周一状态已更新为:{self.values[0]}", ephemeral=True)
步骤4:整合到Bot运行流程
在Bot启动后,将选择菜单添加到视图并发送到指定频道:
intents = discord.Intents.default() intents.message_content = True bot = discord.Bot(intents=intents) @bot.event async def on_ready(): print(f"已登录:{bot.user}") # 替换为你要发送菜单的频道ID target_channel = bot.get_channel(1234567890) view = View() view.add_item(MondaySelect()) await target_channel.send("设置周一直播状态:", view=view) bot.run("你的Bot令牌")
关键注意事项
- 确保JSON文件编码为UTF-8,避免读取时出现乱码
- JSON中的字段值必须和菜单选项的
value严格一致,否则预选中逻辑会失效 - 选择菜单仅支持单个默认选中项,若多个选项设
default=True,Discord会默认选中第一个符合条件的选项
内容的提问来源于stack exchange,提问作者Da Golem
相关产品推荐
相关产品推荐

