Test repo for pynecone! ๐ฒ ๊ณต์ ๋ฌธ์ ๋ฒ์ญํ๋ฉด์ ๋์ ๋์ ํ ์คํธ
๐ฑ Table of contents ๐ฑ
ํ์ธ์ฝ(Pynecone)์ ์น์ฑ์ ๋น๋ํ๊ณ ๋ฐฐํฌํ๊ธฐ ์ํ ํ์คํ ํ๋ ์์ํฌ๋ค.
ํ์ธ์ฝ์ ์๋์ ๋ชฉํ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๋ค:
- ์์ Python
๋ชจ๋ ๊ฒ์ ํ์ด์ฌ์ ์ธ ๊ฒ. ์๋ก์ด ์ธ์ด๋ฅผ ๋ฐฐ์์ผ ํ๋ ๊ฒ์ ๋ํ ๊ฑฑ์ ์ ํ ํ์ ์๋ค. - ๋ฐฐ์ฐ๊ธฐ ์ฌ์ธ ๊ฒ
๋ช ๋ถ ์์ ๋ณธ์ธ๋ง์ ์๋ก์ด ์ฑ์ ๋ง๋ค๊ณ ๊ณต์ ํ์. ์ด๋ ํ ์น ๊ฐ๋ฐ ๊ฒฝํ๋ ํ์ ์๋ค. - ์๋ฒฝํ ์ ๋์ฑ
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์น ํ๋ ์์ํฌ๋ค์ฒ๋ผ ์ ๋์ ์ธ ์ฑ๋ฅ์ ์ ์งํ ๊ฒ. ํ์ธ์ฝ์ ์์ํ๊ธฐ ๋งค์ฐ ์ฝ์ง๋ง, ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ์์ ๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ ํ์ํํจ์ ๊ฐ์ง๊ณ ์๋ค. - ๋ฐฐํฐ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ ๊ฒ(์์ญ: ๋ชจ๋ ๊ฒ์ ๊ฐ์ถ ๊ฒ)
๋ค๋ฅธ ๋ค์ํ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ํ์ ์๋ค. ํ์ธ์ฝ์ ํ๋ก ํธ์๋, ๋ฐฑ์๋, ๊ทธ๋ฆฌ๊ณ ๋ฐฐํฌ๊น์ง ๋ชจ๋ ๋ด๋นํ๋ค.
์ด ๋ถ๋ถ์ ์ง์ pynecone์ ๋ฐฉ๋ฌธํด ํ์ธํ์. ๋ง์ฝ ์ด ๋ ํฌ๊ฐ ํ์ธ์ฝ ๋ฒ์ญ ํ์ด์ง๋ฅผ ๋ฐ๋ก ๋ง๋ ๋ค๋ฉด ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํด์ ๋ฃ์ด๋๊ฒ ๋ค.
๊ฐ๋จํ ๋ง์ด๋์ค/ํ๋ฌ์ค ๋ฒํผ์ด ์๋ ํ๋ฉด ์์ ์ฝ๋:
import pynecone as pc
class State(pc.State):
count: int = 0
def increment(self):
self.count += 1
def decrement(self):
self.count -= 1
def index():
return pc.hstack(
pc.button(
"Decrement",
color_scheme="red",
border_radius="1em",
on_click=State.decrement,
),
pc.heading(State.count, font_size="2em"),
pc.button(
"Increment",
color_scheme="green",
border_radius="1em",
on_click=State.increment,
),
)
app = pc.App(state=State)
app.add_page(index)
app.compile()
ํ์ธ์ฝ ์ฑ์ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ๋์ด ์๋์ง ์์ธํ ๋ค์ฌ๋ค ๋ณด์.
import pynecone as pc
pynecone ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํ๋ฉด์ ๋ชจ๋ ๊ฒ์ด ์์๋๋ค. ๋ชจ๋ ํ์ธ์ฝ ํจ์๋ค๊ณผ ํด๋์ค๋ค์ pc.
์ ๋์ฌ๋ก ์์ํ๋ค.
class State(pc.State):
count: int = 0
State๋ ์ฑ ๋ด์์ ๋ณ๊ฒฝ๋ ์ ์๋ ๋ชจ๋ ๋ณ์๋ค(vars๋ผ๊ณ ํจ)๊ณผ ๋ณ์๋ค์ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ์ ์ํ๋ค.
์์ ์์ ์ฝ๋์์ ์ฐ๋ฆฌ์ state๋ counter์ ํ์ฌ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ํ๋์ ๋ณ์(var), count
๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ฐ๋ฆฌ๋ count
๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
def increment(self):
self.count += 1
def decrement(self):
self.count -= 1
State ์์๋ state ๋ณ์(var)๋ค์ ๋ณ๊ฒฝํ๋ ํจ์, ์ฆ ์ด๋ฒคํธ ํธ๋ค๋ฌ(event handler) ๋ค์ ์ ์ํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ค์ ํ์ธ์ฝ ๋ด์ state๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ฒํผ ํด๋ฆญ์ด๋ ํ ์คํธ ์ ๋ ฅ ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ฉ์์ ์ก์ ์ ๋ฐ๋ฅธ ์๋ต์ผ๋ก ํธ์ถ๋ ์ ์๋ค. ์ด๋ฌํ ์ก์ ๋ค์ ์ด๋ฒคํธ๋ผ๊ณ ํ๋ค.
ํ์ฌ ์ฐ๋ฆฌ์ ์นด์ดํ
์ฑ์ increment
๊ณผ decrement
๋ผ๋ ๋ ๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
def index():
return pc.hstack(
pc.button(
"Decrement",
color_scheme="red",
border_radius="1em",
on_click=State.decrement,
),
pc.heading(State.count, font_size="2em"),
pc.button(
"Increment",
color_scheme="green",
border_radius="1em",
on_click=State.increment,
),
)
์ด ํจ์๋ ์ฑ์ ํ๋ก ํธ์๋๋ฅผ ์ ์ํ๋ค.
์ฐ๋ฆฌ๋ pc.hstack
, pc.button
, pc.heading
๋ฑ๊ณผ ๊ฐ์ ํ์ธ์ฝ์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ์ฌ ํ๋ก ํธ์๋๋ฅผ ์ ์ํ๋ค. ์ปดํฌ๋ํธ๋ค์ ์ค์ฒฉ๋์ด์ ๋ ๋ณต์กํ ๋ ์ด์์์ ๋ง๋๋๋ฐ ์ฌ์ฉํ ์ ์๊ณ , CSS๋ฅผ ํ์ฉํด์ ์คํ์ผ๋ง ํ ์๋ ์๋ค.
ํ์ธ์ฝ์ ์์์ ์ฝ๊ฒ ๋๊ธฐ ์ํด์ 50๊ฐ ์ด์์ ๋นํธ์ธ ์ปดํฌ๋ํธ๋ค์ ์ง์ํ๋ค. ํ์ธ์ฝ ๊ฐ๋ฐํ์ ๊ณ์ํด์ ๋ ๋ง์ ์ปดํฌ๋ํธ๋ค์ ์ถ๊ฐํ๊ณ ์๊ณ , ๋ณธ์ธ์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ์ฝ๊ฒ ํฌ์ฅํ ์ ์๋ค.
pc.heading(State.count, font_size="2em"),
์ปดํฌ๋ํธ๋ค์ ์ฑ์ state ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. pc.heading
์ปดํฌ๋ํธ๋ State.count
์ ์ฐธ์กฐํ์ฌ ์นด์ดํฐ(counter)์ ํ์ฌ ๊ฐ์ ๋ณด์ฌ์ค๋ค. state๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ์ํ์ผ๋ก ์
๋ฐ์ดํธ๋๋ค.
pc.button(
"Decrement",
color_scheme="red",
border_radius="1em",
on_click=State.decrement,
),
์ปดํฌ๋ํธ๋ค์ ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ๋ค์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ฐ์ธ๋ฉํด์ state์ ํต์ ํ๋ค. ์์๋ก, on_click
์ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ํด๋ฆญํ์ ๋ ํธ๋ฆฌ๊ฑฐ๋๋ ์ด๋ฒคํธ๋ค.
์์ ์ฑ์ ์ฒซ ๋ฒ์งธ ๋ฒํผ์ on_click
์ด๋ฒคํธ๋ฅผ State.decrement
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ฐ์ธ๋ฉํ๊ณ , ๋ ๋ฒ์งธ ๋ฒํผ์ State.increment
ํธ๋ค๋ฌ์ ๋ฐ์ธ๋ฉํ๋ค.
app = pc.App(state=State)
๊ทธ ๋ค์, ์ฑ์ ์ ์ํ๊ณ ์ด๋ค state๋ฅผ ์ธ ์ง ์๋ ค์ค๋ค.
app.add_page(index)
๊ทธ๋ฆฌ๊ณ counter ์ปดํฌ๋ํธ์ ์ฑ์ ๋ฃจํธ URL ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค.
app.compile()
๋ง์ง๋ง์ผ๋ก ์ฑ์ ์ปดํ์ผ ํ๊ณ ๋๋ฉด ์ฑ์ ์คํํ ์ค๋น๋ ๋ชจ๋ ๋๋ฌ๋ค.
์ด์ ๋์ด๋ค! ์ฐ๋ฆฌ๋ ํ๋ก ํธ์๋ ๋ฐฑ์๋ ๋ชจ๋๋ฅผ 40 ์ค๋ ์๋๋ ์ฝ๋๋ก ๋ง๋ค์ด ๋๋ค. ์ด์ ๋ถํฐ ์ฐ๋ฆฌ๋ ํ๋์ ๋ช ๋ น์ด๋ก ๊ณ์ํด์ ์น์ ๊ฐ๋ฐ ๋๋ ๋ฐฐํฌํ ์ ์๋ค.
๊ณ์ํด์ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ค์ค๋ก Pynecone์ ์ด๋ป๊ฒ ์ธ ์ ์๋์ง ๋ฐฐ์๋ณด์!
myapp
์ด๋ผ๋ ์๋ก์ด ์ฑ ์์ฑํ๊ธฐ
mkdir myapp
cd myapp
pc init
์์ฑ๋๋ ํ์ผ ๊ตฌ์กฐ:
myapp
โโโ .web
โโโ assets
โโโ myapp
โ โโโ __init__.py
โ โโโ myapp.py
โโโ pcconfig.py
ํ์ด์ฝ ํ๋ก ํธ์๋๋ NextJS ์ฑ์ผ๋ก ์ปดํ์ผ์ ํ๋ค. ์ปดํ์ผ ๊ฒฐ๊ณผ๋ฌผ(output)์ .web
ํด๋์ ์ ์ฅ๋๋ค. ํด๋น ํด๋๋ฅผ ๋ง์ ธ์ผ ํ ์ผ์ ์์ง๋ง, ์ด ํด๋ ๋ด์ฉ๋ฌผ์ ๋ณด๋ ๊ฑด ๋๋ฒ๊น
์ ๋์์ด ๋๋ค.
๊ฐ๊ฐ pynecone ํ์ด์ง๋ .web/pages
ํด๋ ๋ด์ ์์ํ๋ .js
ํ์ผ๋ก ์ปดํ์ผ ๋๋ค.
assets
์ ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋ชจ๋ ์ ์ ์ธ asset์ ์ ์ฅํ ์ ์๋ ๊ณณ์ด๋ค. asset์๋ ์ด๋ฏธ์ง, ํฐํธ, ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๋ค๋ฅธ ํ์ผ์ ๋งํ๋ค.
์์๋ก, assets/image.png
์ ์ ์ฅํ๋ค๋ฉด ์ฑ์์ ์ด๋ฐ ์ฝ๋๋ก ๋ณด์ฌ์ค ์ ์๋ค:
pc.image(src="image.png")
์ฒ์ ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํ๋ฉด ์ฑ ์ด๋ฆ๊ณผ ๋์ผํ ํด๋๊ฐ ์์ฑ๋๋ค. ์ฌ๊ธฐ๊ฐ ๋ฐ๋ก ์ฑ์ ๋ก์ง์ ์์ฑํ๋ ๊ณณ์ด๋ค.
ํ์ธ์ฝ์ myapp/myapp.py
ํ์ผ์ ๊ธฐ๋ณธ ๋ํดํธ ์ฑ์ ์์ฑํ๋ค. ์ด ํ์ผ์ ์์ ํด์ ์ฑ์ ์ทจํฅ๋๋ก ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค.
pcconfig.py
ํ์ผ์๋ ์ฑ์ ํ๊ฒฝ์ค์ ์ด ๋ด๊ฒจ์๋ค. ์ฒ์์ ๊ธฐ๋ณธ์ ์ด๋ ๊ฒ ์๊ฒผ๋ค:
import pynecone as pc
config = pc.Config(
app_name = "myapp",
bun_path="$HOME/.bun/bin/bun",
db_url="sqlite:///pynecone.db",
env=pc.Env.DEV,
)
ํ์ธ์ฝ์ bun ์ ์ฌ์ฉํด์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค. Bun์ pc init
์ด๊ธฐํ ๋ช
๋ น ์ ~/.bun/bin/bun
์ ์๋์ผ๋ก ์ค์น๋๋ค. config ํ์ผ์์ ๋ค๋ฅธ ํน์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ ์๋ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค url์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์น์ ์์ ์ถ๊ฐ์ ์ผ๋ก ์ค๋ช ํ๋ค.
ํ๊ฒฝ(env)์ pc.Env.Dev
๋๋ pc.Env.PROD
๋ก ์ค์ ํ ์ ์๋ค. self hosting ์น์
์์ ์ถ๊ฐ์ ์ผ๋ก ์ค๋ช
ํ๋ค.
Component๋ ํ์ด์ฝ์ ํ๋ฐํธ ์๋๋ฅผ ๊ตฌ์ฑํ๋ ์์์ด๋ค. ์ปดํฌ๋ํธ๋ UI๋ฅผ ๋ ๋ฆฝ์ ์ด๊ณ , ์ฌ์ฌ์ฉ ํ ์ ์๋ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํด ์ค ๋ฟ๋ง ์๋๋ผ, ๊ฐ ์กฐ๊ฐ์ ๋ํด์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ํ๊ณ ์๊ฐํ ์ ์๊ฒ ํด์ค๋ค.
๋ง์ฝ ๋ฆฌ์กํธ(React)์ ์น์ํ๋ค๋ฉด, ํ์ธ์ฝ ์ปดํฌ๋ํธ๋ค์ ๋จ์ํ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ณ ์๋ 'ํฌ์ฅ์ง' ์์ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์ปดํฌ๋ํธ๋ค์ ํ์ด์ฌ ํจ์๋ก ์์ฑ๋๋ค. ์ปดํฌ๋ํธ๋ค์ props ๋ผ๋ ํค์๋ ์ธ์๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ UI๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ค์ฒฉ๋ ์ ์๋ค.
์ปดํฌ๋ํธ๋ค์ Children๊ณผ Props๋ก ๊ตฌ์ฑ๋๋ค.
Children | Props |
---|---|
|
|
pc.text
์ปดํฌ๋ํธ๋ฅผ ํตํด ์์๋ฅผ ์ดํด๋ณด์.
pc.text("Hello World!", color="blue", font_size="1.5em")
์ฌ๊ธฐ์ "Hello World!"
๋ ํ์ํ child ํ
์คํธ์ด๊ณ , color
์ font_size
๋ ๊ธ์์ ๋ชจ์์ ๋ณ๊ฒฝํ ์ ์๋ props์ด๋ค.
์ผ๋ฐ์ ์ธ Python ๋ฐ์ดํฐ ํ์ ์ ์ปดํฌ๋ํธ์ children์ผ๋ก ์ ๋ฌํ ์ ์๋ค. ์ด๋ ๋ฌธ์์ด, ์ซ์, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๊ธฐํ ๊ฐ๋จํ ๋ฐ์ดํฐ ํ์ ๋ค์ ์ ๋ฌํ๋ ๋ฐ ์ ์ฉํ๋ค.
์ด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ด ์ปดํฌ๋ํธ ๋ด์ ํฌํจ๋์ด ์๋ ์กฐ๊ธ ๋ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด์. pc.hstack
์ปดํฌ๋ํธ๋ ์์ ์ children์ ์ํ์ผ๋ก ์ ๋ ฌํ๋ ์ปดํฌ๋ํธ์ด๋ค.
<์ฝ๋ ๊ฒฐ๊ณผ๋ pynecone ๊ณต์ ํํ์ด์ง์์ ํ์ธ...!>
pc.hstack(
pc.circular_progress(
pc.circular_progress_label("50", color="green"),
value=50,
),
pc.circular_progress(
pc.circular_progress_label(
"โ", color="rgb(107,99,246)"
),
is_indeterminate=True,
),
)
์ด๋ค props๋ค์ component์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. ์๋ฅผ ๋ค์ด pc.circular_progress
์ปดํฌ๋ํธ์ value
prop์ ํ๋ก๊ทธ๋ ์ค ๋ฐ์ ์งํ ์ ๋๋ฅผ ์กฐ์ ํ๋ค.
color
๊ฐ์ ์คํ์ผ๋ง prop๋ค์ ๋ง์ ์ปดํฌ๋ํธ๋ค์์ ์ด์ฉ๋๋ค.
์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ด์ง์์ ๊ฐ ์ปดํฌ๋ํธ๋ค์ props๋ฅผ ํ์ธํ ์ ์๋ค.
ํ์ธ์ฝ ์ฑ๋ค์ ํ์ด์ง(page)๋ค๋ก ๊ตฌ์ฑ๋๋ค. ํ์ด์ง๋ ํน์ URL ๊ฒฝ๋ก๋ฅผ ์ปดํฌ๋ํธ๋ก ์ฐ๊ฒฐํ๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ฐํ(๋ฆฌํด)ํ๋ ํจ์๋ฅผ ์ด์ฉํด ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ์ด๋ฆ์ด ๊ฒฝ๋ก๋ก ์ฌ์ฉ๋์ง๋ง, ๊ฒฝ๋ก๋ฅผ ์ง์ ์ง์ ํ ์๋ ์๋ค.
def index():
return pc.text("Root Page")
def about():
return pc.text("About Page")
app = pc.App()
app.add_page(index, path="/")
app.add_page(about, path="/about")
์ด ์์์์ ์ฐ๋ฆฌ๋ index
๋ผ๋ ํ์ด์ง๋ฅผ ๋ฃจํธ ๊ฒฝ๋ก์ ์ถ๊ฐํ๋ค. ๋ง์ฝ dev
๋ชจ๋๋ก ์ฑ์ ์คํํ๊ณ ์๋ค๋ฉด, http://localhost:8000
์ผ๋ก ์ ์ํ๋ฉด ํ์ธํ ์ ์๋ค.
์ ์ฌํ๊ฒ about
ํ์ด์ง๋ http://localhost:8000/about
๊ฒฝ๋ก๋ก ์ ์ํ ์ ์๋ค.
Props(์ง์ญ: ์ํ)๋ ์ปดํฌ๋ํธ์ ํน์ฑ๊ณผ ๋์์ ๋ณ๊ฒฝํ๋ค. Prop๋ค์ ์ปดํฌ๋ํธ ์์ฑ์ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ค.
๊ฐ ์ปดํฌ๋ํธ๋ค์ ๊ณ ์ ํ props๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์๋ฅผ ๋ค์ด pc.avatar
์ปดํฌ๋ํธ๋ ์๋ฐํ ์ด๋ชจํฐ์ฝ์ ์ด๋ฆ์ ์ค์ ํ ์ ์๋ name
prop์ ๊ฐ์ง๊ณ ์๋ค.
์ฝ๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง:
pc.avatar(
name="John Doe",
)
๊ณต์๋ฌธ์๋ฅผ ํตํด ๊ฐ ์ปดํฌ๋ํธ๋ค์ props๋ฅผ ํ์ธํ ์ ์๋ค.
ํ์ธ์ฝ์ ๋์ฑ ๋น ๋ฅธ ์์์ ์ํด ์ฌ๋ฌ๊ฐ์ง ๋นํธ์ธ ์ปดํฌ๋ํธ๋ค์ ์ง์ํ๊ณ ์๋ค.
ํน์ ์ปดํฌ๋ํธ๋ฅผ ์ํ porps ์ธ์๋ ๋๋ถ๋ถ์ ๊ธฐ๋ณธ ์ ๊ณต ์ปดํฌ๋ํธ๋ค์ ๊ด๋ฒ์ํ ์คํ์ผ๋ง์ ์ํ props๋ฅผ ์ง์ํ๋ค.
<์ฝ๋ ํ ์คํธ๋ ๊ณต์ ํํ์ด์ง์์>
์์ ์คํฌ๋ฆฐ์ท:
pc.button(
"Fancy Button",
border_radius="1em",
box_shadow="rgba(151, 65, 252, 0.8) 0 15px 30px -10px",
background_image="linear-gradient(144deg,#AF40FF,#5B42F3 50%,#00DDEB)",
box_sizing="border-box",
color="white",
_hover={
"opacity": 0.85,
},
)
๋ ๋ง์ ์ฑ ์ปค์คํฐ๋ง์ด์ง์ ์ํด์๋ styling docs๋ฅผ ์ฐธ๊ณ ํ์.