我正在使用discord.py 开发一个discord 机器人。在这段代码中,我尝试在按下按钮后打开选择菜单。它应该遍历
.csv
文件中的所有可用项目(项目可用 if row[1] == ''
)并返回它们,然后将所有可用项目放入 SelectMenu
中并让用户选择它们。我尝试了很多方法,但不知道该怎么做。
此外,选择一个项目后,它应该将用户的不和谐名称写入 csv 文件。将不胜感激帮助。
import discord
from discord import ui
from discord.ext import commands
import os
import csv
from dotenv import load_dotenv
load_dotenv('config.env')
client = commands.Bot(command_prefix='!', intents=discord.Intents.all())
@client.command()
async def item(ctx):
view = ItemButtonMenu()
await ctx.send("Choose an item:", view=view)
class ItemButtonMenu(ui.View):
available_items = []
def __init__ (self, *, timeout=None):
self.available_items = []
super().__init__(timeout=timeout)
@ui.button(label = 'Take item', custom_id = 'take_item', style = discord.ButtonStyle.green)
async def take_item(self, interaction: discord.Interaction, button: ui.Button):
with open('items.csv', 'r') as csvfile:
csvreader = csv.reader(csvfile)
next(csvreader)
self.available_items = [row[0] for row in csvreader if row[1] == '']
guild_id = int(os.getenv('GUILD_ID'))
channel = client.get_channel(ID_OF_CHANNEL) #deleted id of there, but in my code it's alright
view = ItemSelectMenu()
await channel.send(view=view, ephemeral=True)
class ItemSelectMenu(ui.View):
options = [discord.SelectOption(label=item) for item in ItemButtonMenu.available_items]
@ui.select(placeholder='Choose an item', options=options)
async def item_select(self, select: ui.Select, interaction: discord.Interaction):
pass
token: str = os.getenv('TOKEN')
client.run(token)
将数据从按钮视图传递到选择视图的正确方法是在选择视图中创建一个
__init__()
方法:
class ItemButtonMenu(ui.View):
def __init__ (self, *, timeout=None):
self.available_items = []
super().__init__(timeout=timeout)
@ui.button(label = 'Take item', custom_id = 'take_item', style = discord.ButtonStyle.green)
async def take_item(self, interaction: discord.Interaction, button: ui.Button):
with open('items.csv', 'r') as csvfile:
csvreader = csv.reader(csvfile)
next(csvreader)
self.available_items = [row[0] for row in csvreader if row[1] == '']
guild_id = int(os.getenv('GUILD_ID'))
channel = client.get_channel(ID_OF_CHANNEL) #deleted id of there, but in my code it's alright
view = ItemSelectMenu(self.available_items)
await channel.send(view=view, ephemeral=True)
class ItemSelectMenu(ui.View):
def __init__(self, available_items, timeout=None):
options = [discord.SelectOption(label=item) for item in available_items]
self.children[0].options = options # edit the select component options
super().__init__(timeout=timeout)
@ui.select(placeholder='Choose an item', max_values=1)
async def item_select(self, interaction: discord.Interaction, select: ui.Select):
pass