pokemon / app.py
yoon-gu's picture
Update app.py
86113c7
raw
history blame
4.75 kB
import os
os.system("pip install gradio==3.46.0")
import gradio as gr
import json
import pandas as pd
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Table, TableStyle, Image, SimpleDocTemplate, PageBreak
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
with open('pokemon.json', 'r') as f:
pokemons = json.load(f)
pokemons_types = ["λͺ¨λ“  νƒ€μž…"] + sorted(set([t for poke in pokemons for t in poke['types']]))
GEN_RANGE = {
"λͺ¨λ“  μ„ΈλŒ€": [1, 1017],
"1μ„ΈλŒ€": [1, 151],
"2μ„ΈλŒ€": [152, 251],
"3μ„ΈλŒ€": [252, 386],
"4μ„ΈλŒ€": [387, 493],
"5μ„ΈλŒ€": [494, 649],
"6μ„ΈλŒ€": [650, 721],
"7μ„ΈλŒ€": [722, 809],
"8μ„ΈλŒ€": [810, 905],
"9μ„ΈλŒ€": [906, 1017]
}
with gr.Blocks(title="λŒ€μΉ˜λ™ 포켓λͺ¬ 도감 생성기 πŸ™") as block:
with gr.Row():
gr.Markdown("# λŒ€μΉ˜λ™ 포켓λͺ¬ 도감 생성기 πŸ™\n- 포켓λͺ¬μ˜ μ„ΈλŒ€λ³„, νƒ€μž…λ³„λ‘œ 도감을 λ§Œλ“€μ–΄μ£ΌλŠ” κ³³μž…λ‹ˆλ‹€.\n- 자료의 μΆœμ²˜λŠ” http://pokemon.fandom.com μž…λ‹ˆλ‹€.")
with gr.Row():
generation = gr.Dropdown(
[f"{k}μ„ΈλŒ€" for k in range(1, 10)] + ["λͺ¨λ“  μ„ΈλŒ€"], value="1μ„ΈλŒ€", label="πŸŒˆν¬μΌ“λͺ¬ μ„ΈλŒ€", info="μ›ν•˜λŠ” 포켓λͺ¬ μ„ΈλŒ€λ₯Ό μ„ νƒν•˜μ„Έμš”."
)
poke_types = gr.Dropdown(
pokemons_types, value="λͺ¨λ“  νƒ€μž…", label="πŸ©»ν¬μΌ“λͺ¬ νƒ€μž…", info="μ›ν•˜λŠ” 포켓λͺ¬ νƒ€μž…μ„ μ„ νƒν•˜μ„Έμš”."
)
button = gr.Button(value="🎩 도감 생성")
with gr.Row():
with gr.Column():
download = gr.File(label="πŸ”‘νŒŒλž€ 글씨λ₯Ό λˆŒλŸ¬μ„œ λ‹€μš΄λ‘œλ“œ λ°›μœΌμ„Έμš”.")
df_view = gr.DataFrame(label="πŸ“ν¬μΌ“λͺ¬ 리슀트", wrap=True, row_count=10)
with gr.Column():
gallery = gr.Gallery(columns=3, label="πŸ‘©πŸ»β€πŸŽ¨ν¬μΌ“λͺ¬ 가러리", rows=4, height=600)
report = gr.Markdown("## νƒ€μž…λ³„ 포켓λͺ¬ 뢄석")
def write_pdf(gen, poke_type):
filename = f'포켓λͺ¬{gen}_{poke_type}.pdf'
# PDF λ¬Έμ„œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
pdfmetrics.registerFont(TTFont("λ‚˜λˆ”κ³ λ”•", "NanumGothic.ttf"))
doc = SimpleDocTemplate(filename, pagesize=A4)
# ν…Œμ΄λΈ” μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€.
style = TableStyle([
('TEXTCOLOR', (0, 1), (-1, -1), colors.gray),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, -1), 'λ‚˜λˆ”κ³ λ”•'),
('SIZE', (0, 0), (-1, -1), 50),
('BACKGROUND', (0, 1), (-1, 1), colors.white),
('GRID', (0, 0), (-1, -1), 1, colors.black),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('LEADING', (0, 0), (-1, -1), 14), # 라인 간격 μ‘°μ •
('BOTTOMPADDING', (0, 0), (-1, -1), 60),
])
images = []
story = []
data_dict = []
start, end = GEN_RANGE[gen]
for k in range(start, end+1):
name = pokemons[k-1]['name']
number = pokemons[k-1]['number']
types = pokemons[k-1]['types']
image_path = pokemons[k-1]['image_path']
if poke_type == "λͺ¨λ“  νƒ€μž…":
condition = True
else:
condition = poke_type in types
if condition:
data_dict.append(
dict(이름=name, 번호=number, νƒ€μž…='+'.join(types))
)
images.append((image_path, f"{number} {name}({'+'.join(types)})"))
# PDF에 이미지λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. 이미지 파일의 경둜λ₯Ό μ§€μ •ν•˜μ„Έμš”.
image = Image(image_path, width=13.5*cm, height=13.5*cm)
# ν…Œμ΄λΈ” 데이터λ₯Ό μ€€λΉ„ν•©λ‹ˆλ‹€.
data = [
[number],
[image], # 2번째 행에 이미지λ₯Ό μΆ”κ°€ν•  κ²ƒμž…λ‹ˆλ‹€.
['+'.join(types)],
[name],
]
# ν…Œμ΄λΈ” 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
table = Table(data)
table.setStyle(style)
story.append(table)
doc.build(story)
df = pd.DataFrame(data_dict)
analysis = df[['이름', 'νƒ€μž…']].groupby(by='νƒ€μž…').count().sort_values(by='이름', ascending=False).to_markdown().replace('이름', '개수')
return df[['번호', '이름', 'νƒ€μž…']], filename, images, analysis
button.click(write_pdf, [generation, poke_types], [df_view, download, gallery, report])
block.queue(concurrency_count=3)
block.launch()