File size: 4,746 Bytes
2a33559 6cd90ae 26d8ca3 6cd90ae 6da718d 6cd90ae 6da718d 6cd90ae 55efc3b 7c1249e 55efc3b b78a8f5 55efc3b b78a8f5 55efc3b b78a8f5 55efc3b b78a8f5 55efc3b 86113c7 55efc3b 6cd90ae 55efc3b 26d8ca3 55efc3b 26d8ca3 55efc3b 5f54590 6cd90ae 55efc3b 6cd90ae 55efc3b 26d8ca3 55efc3b 7c1249e b78a8f5 26d8ca3 b78a8f5 55efc3b fea25ac |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
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() |