๐Ÿ‰ Leviathan UI v1.0.0 โ€” ํŒŒ์ด์ฌ์˜ ํ˜„๋Œ€์ ์ธ ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค

๋ฐœํ–‰: (2026๋…„ 1์›” 15์ผ ์˜ค์ „ 04:23 GMT+9)
7 min read
์›๋ฌธ: Dev.to

Iโ€™m ready to translate the article for you, but I need the full text youโ€™d like translated. Could you please paste the content (excluding the source line youโ€™ve already provided) here? Once I have it, Iโ€™ll translate it into Korean while preserving the original formatting, markdown, and code blocks.

๐Ÿ“ฆ Leviathan UI๋ž€?

Leviathan UI๋Š” ํŒŒ์ด์ฌ์—์„œ ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฐ€๋ฒผ์šด ํŒจํ‚ค์ง€๋กœ, ๋‹ค์Œ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค:

  • ๊ต์œก์šฉ, ๊ธฐ์ˆ ์  ๋˜๋Š” ์‹คํ—˜์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.
  • ๋ฌด๊ฑฐ์šด ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋น ๋ฅธ GUI๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ.
  • ํˆฌ๋ช…๋„, ๋ธ”๋Ÿฌ, UWP ์Šคํƒ€์ผ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ–์ถ˜ ์‹œ๊ฐ์  ์ธํ„ฐํŽ˜์ด์Šค.

๐Ÿ‘‰ ํ•œ๋งˆ๋””๋กœ: ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์— ๋ชจ์–‘๊ณผ ์Šคํƒ€์ผ์„ ์•„์ฃผ ์ ์€ ์ฝ”๋“œ๋กœ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš™๏ธ ์„ค์น˜

Leviathan UI๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด Python๊ณผ pip์ด ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ์„ ์ž…๋ ฅํ•˜์„ธ์š”:

pip install leviathan-ui==1.0.0

์ด ๋ช…๋ น์€ PyPI์— ๊ฒŒ์‹œ๋œ ์•ˆ์ •์ ์ธ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Source: โ€ฆ

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QPushButton,
    QVBoxLayout,
    QWidget,
    QLabel,
)
from PyQt5.QtCore import Qt
from lib.shared import (
    InmersiveSplash,
    InmojiTrx,
    WipeWindow,
    CustomTitleBar,
)


class MiAppPrincipal(QWidget):
    def __init__(self):
        super().__init__()
        self.setObjectName("MainWindow")
        self.resize(900, 550)

        # 1๏ธโƒฃ WipeWindow โ€“ โ€œpolishedโ€ ๋ชจ๋“œ (๊ทธ๋ฆผ์ž์™€ ๋‘ฅ๊ทผ ์œ ๋ฆฌ)
        (
            WipeWindow.create()
            .set_mode("polished")
            .set_background("auto")   # โ€œautoโ€: Windows ํŒ”๋ ˆํŠธ์™€ ๋™๊ธฐํ™”
            .set_radius(10)           # ์ •์‚ฌ๊ฐํ˜• ์ฐฝ์— ๊ถŒ์žฅ๋˜๋Š” ๋ฐ˜๊ฒฝ
            .apply(self)               # ๋ชจ๋“œ ์‹œ์ž‘
        )

        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        # 2๏ธโƒฃ CustomTitleBar โ€“ Windowsโ€ฏ11 ์Šคํƒ€์ผ (SVG ๋ฒ„ํŠผ + ๊ฐ•์กฐ ์ƒ‰์ƒ ํ†ตํ•ฉ)
        self.title_bar = CustomTitleBar(self, title="LEVIATHAN ENGINE V2.0")
        layout.addWidget(self.title_bar)

        # ์ฝ˜ํ…์ธ  ์˜์—ญ
        content = QWidget()
        content_lay = QVBoxLayout(content)
        content_lay.setAlignment(Qt.AlignCenter)

        label = QLabel("Test de Leviathanโ€‘UI: Polished Mode")
        label.setStyleSheet(
            "color: white; font-size: 24px; font-weight: bold; font-family: 'Segoe UI';"
        )
        content_lay.addWidget(label, alignment=Qt.AlignCenter)

        self.btn = QPushButton("Cerrar app")
        self.btn.setFixedSize(280, 50)
        self.btn.setStyleSheet(
            """
            QPushButton {
                background-color: rgba(255,255,255,0.08);
                color: white;
                border: 1px solid rgba(255,255,255,0.3);
                border-radius: 12px;
                font-weight: bold;
                font-size: 14px;
            }
            QPushButton:hover {
                background-color: white;
                color: black;
            }
            """
        )
        content_lay.addWidget(self.btn, alignment=Qt.AlignCenter)
        layout.addWidget(content, 1)

        self.btn.clicked.connect(self.close)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    # 3๏ธโƒฃ InmojiTrx โ€“ ํ”„๋ฆฌ๋ฏธ์—„ ์•„์ด์ฝ˜ (์ด๋ชจ์ง€ ๋˜๋Š” BETA ๋กœ๊ณ )
    InmojiTrx("๐Ÿ‰").apply(app)

    # 4๏ธโƒฃ ์‹œ์ž‘ ์Šคํ”Œ๋ž˜์‹œ (adaptive ๋ชจ๋“œ: ์ž‘์—… ํ‘œ์‹œ์ค„์„ ๊ฐ€๋ฆฌ์ง€ ์•Š์Œ)
    mi_app = MiAppPrincipal()
    splash = (
        InmersiveSplash(title="Iniciando...", logo="๐Ÿ‰", color="auto")
        .set_mode("adaptive")               # DPI์— ๋งž๊ฒŒ ์กฐ์ •
        .set_phrases(["Iniciando UWP"])
        .on_finish(mi_app.show)            # ์Šคํ”Œ๋ž˜์‹œ๊ฐ€ ๋๋‚œ ํ›„ ์‹คํ–‰
        .attach_to_window(
            mi_app,
            exit_phrases=["Saliendo de la UWP"],  # ์ข…๋ฃŒ ์‹œ ๋ฉ”์‹œ์ง€
        )
    )

    # ์ถœ๋ฐœ!
    splash.start()
    sys.exit(app.exec_())

๋ชจ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ

๊ฐ’์„ค๋ช…
"polished"ํด๋ž˜์‹ UWP ์Šคํƒ€์ผ (ํ˜„๋Œ€์ ์ธ Windows)
"ghost"์œ ๋ฆฌ์ฒ˜๋Ÿผ ํˆฌ๋ช…ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
"ghostBlur"ํ๋ฆผ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ์•ก์ฒด ์œ ๋ฆฌ

๐Ÿ‘‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ธฐ๋ณธ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”Œ ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด โ€” ์•ฑ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ

์ด ์Šคํ”Œ๋ž˜์‹œ๋Š” Leviathan UI๋กœ ๋งŒ๋“  ์•ฑ์„ ์—ด๊ฑฐ๋‚˜ ๋‹ซ์„ ๋•Œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“œ๋ž˜๊ณค๊ณผ ์–ด๋‘์šด ๋ฐฐ๊ฒฝ์ด ๊ธฐ์ˆ ์ ์ด๊ณ  ์‹ ๋น„๋กœ์šด ๋ถ„์œ„๊ธฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ์™€ ์ข…๋ฃŒํ•  ๋•Œ ์›ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Splash UWP โ€“ pantalla de inicio y cierre de apps

โœจ Polished Mode โ€” ํด๋ž˜์‹ UWP ์Šคํƒ€์ผ

์ด ๋ชจ๋“œ๋Š” ๊น”๋”ํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹จ์ƒ‰ ๋ฐฐ๊ฒฝ๊ณผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ๋ฒ„ํŠผ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•์„ฑ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ค‘์‹œํ•˜๋Š” ๋ฐ์Šคํฌํ†ฑ ์œ ํ˜• ์•ฑ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

  • Windows UWP ์Šคํƒ€์ผ.
  • ๋ณต์žกํ•œ ์‹œ๊ฐ ํšจ๊ณผ ์—†์ด ๋ˆˆ์— ๋ณด์ด๋Š” ๋ฒ„ํŠผ.
  • ์ „๋ฌธ์ ์ด๊ฑฐ๋‚˜ ๊ต์œก์ ์ธ ํ™˜๊ฒฝ์— ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

Polished Mode

๐Ÿ‘ป Ghosted Mode โ€” ์šฐ์•„ํ•œ ํˆฌ๋ช…์„ฑ

์ด ๋ชจ๋“œ์—์„œ๋Š” Leviathan UI๊ฐ€ ์ž์—ฐ ๋ฐฐ๊ฒฝ ์œ„์— ํˆฌ๋ช…ํ•œ ์œ ๋ฆฌ ์ธต์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋‹ˆ๋ฉ€ํ•œ ๋ฏธํ•™๊ณผ ํ™˜๊ฒฝ๊ณผ์˜ ์—ฐ๊ฒฐ์„ ์ถ”๊ตฌํ•˜๋Š” ์•ฑ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์— ๋ณด์ด๋Š” ๋ฐฐ๊ฒฝ.
  • ํ’๊ฒฝ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐฐ๊ฒฝ ์œ„์— ๋–  ์žˆ๋Š” ๋ฒ„ํŠผ.
  • ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์ฐฝ์˜์ ์ธ ์•ฑ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Ghosted Mode

๐Ÿ’ง Ghosted Blur Mode โ€” ํ๋ฆฟํ•œ ์œ ๋ฆฌ ํšจ๊ณผ

์ด๊ฒƒ์€ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ€์žฅ ์ง„๋ณด๋œ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ํˆฌ๋ช…๋„์™€ ๋™์  ๋ธ”๋Ÿฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ˜„๋Œ€์ ์ธ UWP ์Šคํƒ€์ผ์˜ ์•ก์ฒด ์œ ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๊นŠ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํ๋ฆฟํ•œ ๋ฐฐ๊ฒฝ.
  • ์‹œ๊ฐ์ ์œผ๋กœ ๋‹๋ณด์ด๊ณ  ์‹ถ์€ ์•ฑ์— ์ด์ƒ์ .
  • Fluent Design ์Šคํƒ€์ผ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์˜๊ฐ์„ ๋ฐ›์Œ.

Ghosted Blur Mode

๐ŸŒ ๊ณต์‹ ๋งํฌ

๐ŸŽฏ ๊ฒฐ๋ก 

Leviathan UI๋Š” Python์—์„œ ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹คํ—˜ํ•˜๊ณ  ์‹ถ์€ ์ดˆ๋ณด์ž์—๊ฒŒ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•˜๊ฒŒ ํ•  ํ•„์š” ์—†์ด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋„ ๊ธฐ๋Šฅ์ ์ด๊ณ  ๋งค๋ ฅ์ ์ธ ์ฐฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ: ๋จผ์ € polished๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ต์ˆ™ํ•ด์ง€๊ณ , ๊ทธ ๋‹ค์Œ์— ํˆฌ๋ช… ๋ฐ ๋ธ”๋Ÿฌ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์•ฑ์— ์Šคํƒ€์ผ์„ ์ž…ํ˜€ ๋ณด์„ธ์š”.

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ์Œ์— ๋“ ๋‹ค๋ฉด GitHub์ด๋‚˜ Patreon์—์„œ ์ง€์›์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”. ์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐ์Šคํฌํ†ฑ์šฉ ์›Œ๋“ค์„ ๋งŒ๋“ค์—ˆ์–ด์š”!

๋ฐ์Šคํฌํ†ฑ์šฉ Wordle์„ ์ง์ ‘ ๋งŒ๋“  GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ปค๋ฒ„ ์ด๋ฏธ์ง€! https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format...

2026๋…„์— ๋‹น์‹ ์ด ํ•„์š”๋กœ ํ•  ์œ ์ผํ•œ python GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Introduction PyUIkit์€ ๋ฐ์Šคํฌํ†ฑ GUI ๊ฐœ๋ฐœ์— HTMLโ€‘like ๋‹จ์ˆœ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Divโ€‘based ๋ ˆ์ด์•„์›ƒ๊ณผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ โ€ฆ

Leviathan UI PyQt5 ํ”„๋ ˆ์ž„์›Œํฌ โ€“ Windows 11 ์ฝ”์–ด ์Šคํ‚จ์—์„œ ์˜๊ฐ์„ ๋ฐ›์Œ

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” jesusquijada34์ด๋ฉฐ Leviathan UI๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฐœ๋ฐœํ•œ Python ํŒจํ‚ค์ง€๋กœ, ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Show HN: SnackBase โ€“ ์˜คํ”ˆ์†Œ์Šค, GxP ์ค€์ˆ˜ ๋ฐฑ์—”๋“œ, Python ํŒ€์„ ์œ„ํ•œ

์•ˆ๋…•ํ•˜์„ธ์š” HN, ์ €๋Š” SnackBase์˜ ์ฐฝ์‹œ์ž์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํ—ฌ์Šค์ผ€์–ด์™€ ๋ผ์ดํ”„ ์‚ฌ์ด์–ธ์Šค ๋ถ„์•ผ์—์„œ ์ผํ•˜๊ณ  ์žˆ์–ด์„œ ๊ฐ™์€ โ€˜compโ€ฆโ€™๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋ช‡ ๋‹ฌ์”ฉ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด ์ง€๊ฒจ์›Œ์„œ ์ด๊ฒƒ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.