pokemon / app.py
yoon-gu's picture
Update app.py
6da718d
raw
history blame
3.71 kB
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]
}
generation = gr.Dropdown(
[f"{k}์„ธ๋Œ€" for k in range(1, 10)] + ["๋ชจ๋“  ์„ธ๋Œ€"], value="1์„ธ๋Œ€", label="ํฌ์ผ“๋ชฌ ์„ธ๋Œ€", info="์›ํ•˜๋Š” ํฌ์ผ“๋ชฌ ์„ธ๋Œ€๋ฅผ ์„ ํƒํ•˜์„ธ์š”."
)
poke_types = gr.Dropdown(
pokemons_types, value="๋ชจ๋“  ํƒ€์ž…", label="ํฌ์ผ“๋ชฌ ํƒ€์ž…", info="์›ํ•˜๋Š” ํฌ์ผ“๋ชฌ ํƒ€์ž…์„ ์„ ํƒํ•˜์„ธ์š”."
)
download = gr.File(label="ํŒŒ๋ž€ ๊ธ€์”จ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์„ธ์š”.")
text = gr.DataFrame(label="ํฌ์ผ“๋ชฌ ๋ฆฌ์ŠคํŠธ")
def write_pdf(gen, poke_type, progress=gr.Progress()):
filename = f'ํฌ์ผ“๋ชฌ{gen}_{poke_type}.pdf'
pdfmetrics.registerFont(TTFont("๋‚˜๋ˆ”๊ณ ๋”•", "NanumGothic.ttf"))
# 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),
])
story = []
data_dict = []
start, end = GEN_RANGE[gen]
for k in progress.tqdm(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, No=number, ํƒ€์ž…='+'.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)
return df[['No', '์ด๋ฆ„', 'ํƒ€์ž…']], filename
demo = gr.Interface(write_pdf, [generation, poke_types], [text, download], title="๋Œ€์น˜๋™ ํฌ์ผ“๋ชฌ ๋„๊ฐ ์ƒ์„ฑ๊ธฐ",
description="์›ํ•˜๋Š” ํฌ์ผ“๋ชฌ ์„ธ๋Œ€๋ฅผ ์„ ํƒํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”.")
demo.queue(concurrency_count=3)
demo.launch()