이전글보기
[정보/Discord Bot] - [discord.py 2.0] 07. 대화에 Embed 추가하기
[정보/Discord Bot] - [discord.py 2.0] 08. Embed 꾸미기
[정보/Discord Bot] - [discord.py 2.0] 09. Cogs를 생성하여 소스코드 분할하기
[정보/Discord Bot] - [discord.py 2.0] 10. Bot을 종료하지 않고 Cogs reload 하기
[정보/Discord Bot] - [discord.py 2.0] 11. 메세지에 버튼 추가하기
이번 포스팅에서는 Select 박스를 사용하는 방법을 포스팅할겁니다.
Select 박스란? 여러 항목중에서 사용자가 특정 항목을 선택할수 있도록 Listup 해주는 기능이라고 보시면 됩니다.
주로 사용하게 되는 기능에 대한 reference는 다음과 같습니다.
버튼과 동일하게 View 를 사용해서 추가를 하지만, 직접적으로 추가하진 못하고 View의 add_Item 메소드를 통해 추가하셔야 합니다.
이번에도 새로운 기능이니, 새로 select.py 파일을 생성하여 만들어보았습니다.
완성된 코드로 설명드리겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import discord
from discord.ext import commands
class SelectFunction(discord.ui.Select):
def __init__(self):
options = []
for index in range(0, 3):
options.append(discord.SelectOption(label=f'label_{index}',
description=f'description_{index}', value=f'value_{index}'))
super().__init__(placeholder='Select 기능', min_values=1, max_values=1, options=options)
async def callback(self, interaction: discord.Interaction):
await interaction.channel.send(interaction.data["values"][0]+"을 선택하셨습니다.")
await interaction.message.delete()
class SelectView(discord.ui.View):
def __init__(self):
super().__init__()
self.add_item(SelectFunction())
class Select(commands.Cog):
def __init__(self, app):
self.app = app
@commands.command(name='선택')
async def select(self, ctx):
await ctx.send("선택 명령어", view=SelectView())
async def setup(app):
await app.add_cog(Select(app))
|
cs |
주요하게 보셔야 할 부분이 SelectFunction 클래스와 SelectView 클래스입니다.
30 Line 에서 사용자의 명령어에 따라 보낼때 view=SelectView() 하는 것은 Button을 붙일 때와 차이가 없으나, SelectView 내부에서 Dropdown List 를 추가하기 위해서, add_item을 사용합니다.
전체 소스코드를 올려드렸으니 이번엔 호출순서대로 설명을 드리겠습니다.
순서는 아래쪽에서부터 거슬러 올라간다고 보시면 됩니다.
@commands.command(name='선택')
async def select(self, ctx):
await ctx.send("선택 명령어", view=SelectView())
28~30 : 사용자가 "!선택" 명령어를 입력했을 때, SelectView 를 추가한 메세지를 전송합니다.
class SelectView(discord.ui.View):
def __init__(self):
super().__init__()
self.add_item(SelectFunction())
18~21 : 생성되는 SelectView에는 생성시 내부 항목으로 SelectFunction 을 추가로 생성하여 출력합니다.
class SelectFunction(discord.ui.Select):
5 : 생성되는 Select 기능의 View 를 정의합니다
options = []
for index in range(0, 3):
options.append(discord.SelectOption(label=f'label_{index}',
description=f'description_{index}', value=f'value_{index}'))
7~10 : 생성되는 Dropdown 메뉴에 선택항목을 추가합니다.
label : 항목별 이름입니다 (필수입력항목)
description : 항목별 설명입니다. (선택입력항목)
value : 항목의 숨겨진 값이 됩니다 (선택입력항목)
value 를 추가하면 각 항목 선택시 value 값이 전달되고 value를 입력하지 않으면, label 값이 콜백함수로 넘어가게 됩니다.
super().__init__(placeholder='Select 기능', min_values=1, max_values=1, options=options)
11 : 위에서 설정한 options 항목으로 Select 기능을 생성합니다.
min_values : 최소 선택항목 (0~25)
max_values : 최대 선택항목 (1~25)
options : 위에서 등록한 List에 출력할 항목
async def callback(self, interaction: discord.Interaction):
await interaction.channel.send(interaction.data["values"][0]+"을 선택하셨습니다.")
await interaction.message.delete()
13~15 : Select 항목이 선택완료 된 경우 호출되는 콜백함수입니다. 만약 min_value값에 만족하지 못할경우, 호출되지 않습니다.
option 항목에서 value의 값의 세팅유무에 상관없이 접근은 interaction.data["value"] 로 동일합니다.
최종 결과는 아래 이미지처럼 출력이 됩니다.
포스팅에 사용된 모든 소스코드는 아래 Github에서 확인하실 수 있습니다.
https://github.com/aochfl/ChoRi_TestBot
참고자료
https://discord.com/developers/docs/reference - ( Discord Developer API )
https://discordpy.readthedocs.io/en/latest/index.html - ( discord.py library 문서 )
'정보 > Discord Bot' 카테고리의 다른 글
[discord.py 2.0] 14. 오류 발생 시 예외 처리하기 (0) | 2022.09.16 |
---|---|
[discord.py 2.0] 13. Modal 기능으로 사용자입력창 띄우기 (0) | 2022.09.15 |
[discord.py 2.0] 11. 메세지에 버튼 추가하기 (0) | 2022.09.10 |
[discord.py 2.0] 10. Bot을 종료하지 않고 Cogs reload 하기 (0) | 2022.09.10 |
[discord.py 2.0] 09. Cogs를 생성하여 소스코드 분할하기 (0) | 2022.09.08 |