
파이썬으로 데스크톱 애플리케이션을 만들려고 할 때 가장 먼저 부딪히는 문제가 "어떤 GUI 라이브러리를 써야 하지?"입니다. 검색해보면 Tkinter, PyQt, Kivy 등 수십 가지 옵션이 나오고, 각각 장단점이 달라서 선택이 쉽지 않습니다. 더 골치 아픈 건 라이브러리마다 라이선스, 학습 난이도, 외관이 천차만별이라는 점입니다. 이 글에서는 2025년 기준으로 실제로 쓸 만한 12가지 파이썬 GUI 라이브러리를 소개하고, 각각 어떤 상황에 적합한지 서술합니다.
1부: 기본 및 전통 라이브러리
1. Tkinter
한 줄 요약: 파이썬에 기본 내장된 GUI 라이브러리, 설치 없이 바로 사용 가능
Tkinter는 파이썬을 설치하면 따라오는 표준 GUI 라이브러리입니다. 별도 설치가 필요 없다는 점이 가장 큰 장점입니다. pip install 없이 import tkinter만 하면 바로 창을 띄울 수 있습니다. 이 때문에 파이썬 입문자가 처음 접하는 GUI 라이브러리가 대부분 Tkinter입니다. 대학 강의나 프로그래밍 책에서도 GUI를 다룰 때 Tkinter를 기본으로 가르칩니다.
Tkinter의 내부는 Tcl/Tk라는 GUI 툴킷을 파이썬에서 사용할 수 있게 바인딩한 것입니다. Tcl/Tk는 1990년대부터 존재한 크로스 플랫폼 GUI 툴킷으로, Windows, macOS, Linux 모두에서 동작합니다. 덕분에 Tkinter로 만든 애플리케이션도 세 운영체제에서 모두 실행됩니다.
문제는 외관입니다. Tkinter의 기본 위젯들은 1990년대 스타일 그대로입니다. 버튼, 입력창, 체크박스 모두 투박하고 구식으로 보입니다. ttk(themed Tk) 모듈을 사용하면 좀 나아지지만, 여전히 현대적인 앱과는 거리가 있습니다. 그래서 Tkinter는 "빠르게 프로토타입을 만들거나, 내부 도구처럼 외관이 중요하지 않은 상황"에 적합합니다. 사용자에게 배포할 제품을 만든다면 다른 선택지를 고려해야 합니다.
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Tkinter 예제")
root.geometry("300x200")
label = ttk.Label(root, text="Hello, Tkinter!")
label.pack(pady=20)
button = ttk.Button(root, text="클릭", command=lambda: print("클릭됨"))
button.pack()
root.mainloop()
🔗 공식 문서: https://docs.python.org/3/library/tkinter.html
tkinter — Python interface to Tcl/Tk
Source code: Lib/tkinter/__init__.py The tkinter package (“Tk interface”) is the standard Python interface to the Tcl/Tk GUI toolkit. Both Tk and tkinter are available on most Unix platforms, inclu...
docs.python.org
2. CustomTkinter
한 줄 요약: Tkinter를 현대적으로 만들어주는 확장 라이브러리, 다크 모드와 둥근 모서리 지원
CustomTkinter는 Tkinter의 외관 문제를 해결하기 위해 만들어진 라이브러리입니다. TomSchimansky라는 개발자가 만들었고, GitHub에서 1만 개 이상의 스타를 받으며 인기를 얻었습니다. Tkinter 위에서 동작하기 때문에 Tkinter의 모든 기능을 그대로 사용하면서 현대적인 UI 요소를 추가할 수 있습니다.
CustomTkinter의 가장 큰 특징은 자동 다크 모드 지원입니다. 운영체제의 테마 설정을 감지해서 라이트 모드와 다크 모드를 자동으로 전환합니다. 위젯들도 둥근 모서리, 그라데이션, 호버 효과 등 현대적인 디자인 요소를 갖추고 있습니다. 기존 Tkinter 코드를 거의 그대로 유지하면서 import만 바꾸면 되기 때문에 마이그레이션도 쉽습니다.
학습 곡선도 완만합니다. Tkinter를 알고 있다면 CustomTkinter는 거의 동일한 API를 사용하므로 금방 익힐 수 있습니다. Tk() 대신 CTk(), Button 대신 CTkButton()을 쓰는 정도의 차이입니다. MIT 라이선스라서 상업적 사용에도 제한이 없습니다.
단점은 Tkinter의 구조적 한계를 완전히 극복하지는 못한다는 점입니다. 복잡한 레이아웃이나 고급 위젯이 필요한 경우 Qt 기반 라이브러리가 더 나은 선택입니다. 하지만 "Tkinter 수준의 간단한 앱인데 외관만 좀 더 현대적으로"라는 요구사항에는 최적의 선택입니다.
import customtkinter as ctk
ctk.set_appearance_mode("System")
ctk.set_default_color_theme("blue")
app = ctk.CTk()
app.title("CustomTkinter 예제")
app.geometry("400x300")
label = ctk.CTkLabel(app, text="Hello, CustomTkinter!", font=("Arial", 20))
label.pack(pady=30)
button = ctk.CTkButton(app, text="클릭", command=lambda: print("클릭됨"))
button.pack()
entry = ctk.CTkEntry(app, placeholder_text="텍스트 입력...")
entry.pack(pady=20)
app.mainloop()
🔗 GitHub: https://github.com/TomSchimansky/CustomTkinter
GitHub - TomSchimansky/CustomTkinter: A modern and customizable python UI-library based on Tkinter
A modern and customizable python UI-library based on Tkinter - TomSchimansky/CustomTkinter
github.com
🔗 문서: https://customtkinter.tomschimansky.com/
Official Documentation And Tutorial | CustomTkinter
CustomTkinter is a python desktop UI-library based on Tkinter, which provides modern looking and fully customizable widgets.
customtkinter.tomschimansky.com
3. PyQt6
한 줄 요약: Qt 프레임워크의 파이썬 바인딩, 가장 강력하고 기능이 풍부하지만 GPL 라이선스 주의
PyQt6는 Qt라는 C++ GUI 프레임워크를 파이썬에서 사용할 수 있게 해주는 바인딩입니다. Qt는 1995년부터 개발되어온 성숙한 프레임워크로, KDE 데스크톱 환경, VirtualBox, Autodesk Maya 등 수많은 상용 소프트웨어에서 사용됩니다. PyQt를 사용하면 이 강력한 프레임워크의 모든 기능을 파이썬에서 활용할 수 있습니다.
Qt의 강점은 위젯의 다양성과 완성도입니다. 기본 버튼, 입력창은 물론이고, 테이블, 트리뷰, 차트, 달력, 컬러 피커, 프린트 다이얼로그까지 상상할 수 있는 거의 모든 UI 요소가 내장되어 있습니다. 스타일 시트(QSS)로 CSS처럼 외관을 커스터마이징할 수 있고, Qt Designer라는 드래그 앤 드롭 도구로 UI를 시각적으로 설계할 수도 있습니다.
PyQt의 큰 단점은 라이선스입니다. Riverbank Computing이라는 회사가 개발하며, GPL 라이선스를 따릅니다. 오픈소스 프로젝트라면 문제없지만, 소스 코드를 공개하지 않는 상용 소프트웨어를 만들려면 상업용 라이선스를 구매해야 합니다. 가격은 개발자당 연간 $550 정도입니다. 이 라이선스 문제 때문에 많은 개발자가 PySide6로 넘어갔습니다.
학습 곡선도 가파른 편입니다. Qt는 방대한 프레임워크라서 공식 문서만 읽어도 몇 주가 걸립니다. 하지만 그만큼 "불가능한 것이 없다"는 장점이 있습니다. 전문적인 데스크톱 애플리케이션을 만들어야 하고, 라이선스가 문제되지 않는다면 PyQt6는 최고의 선택입니다.
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget
app = QApplication([])
window = QMainWindow()
window.setWindowTitle("PyQt6 예제")
window.setGeometry(100, 100, 400, 300)
centralWidget = QWidget()
layout = QVBoxLayout()
label = QLabel("Hello, PyQt6!")
label.setStyleSheet("font-size: 20px; padding: 20px;")
layout.addWidget(label)
button = QPushButton("클릭")
button.clicked.connect(lambda: print("클릭됨"))
layout.addWidget(button)
centralWidget.setLayout(layout)
window.setCentralWidget(centralWidget)
window.show()
app.exec()
🔗 공식 사이트: https://www.riverbankcomputing.com/software/pyqt/
Riverbank Computing | Introduction
What is PyQt? PyQt is a set of Python bindings for The Qt Company's Qt application framework. The bindings are implemented as a set of Python modules and contain over 1,000 classes. PyQt6 supports Qt6 and runs on Windows (Intel and ARM), macOS (Intel and A
www.riverbankcomputing.com
🔗 튜토리얼: https://www.pythonguis.com/pyqt6-tutorial/
PyQt6 Tutorial 2026, Create Python GUIs with Qt
The easy way to create desktop applications. PyQt is a Python library for creating GUI applications using the Qt toolkit.
www.pythonguis.com
4. PySide6
한 줄 요약: Qt 공식 파이썬 바인딩, PyQt와 거의 동일하지만 LGPL 라이선스로 상용 친화적
PySide6는 Qt를 만든 Qt Company에서 공식적으로 제공하는 파이썬 바인딩입니다. "Qt for Python"이라고도 불립니다. PyQt6와 기능적으로 거의 동일하고, API도 99% 호환됩니다. import문만 바꾸면 PyQt 코드가 PySide에서 돌아가는 경우가 대부분입니다.
PySide6를 선택하는 가장 큰 이유는 라이선스입니다. LGPL(Lesser GPL) 라이선스를 따르기 때문에, 동적 링크 방식으로 사용하면 소스 코드를 공개하지 않고도 상용 소프트웨어를 배포할 수 있습니다. 별도의 상업용 라이선스를 구매할 필요가 없습니다. 스타트업이나 개인 개발자가 수익을 내는 앱을 만들 때 PyQt 대신 PySide를 선택하는 이유입니다.
Qt Company가 직접 관리하기 때문에 Qt의 새로운 기능이 더 빨리 반영되는 경향도 있습니다. 최신 Qt 6의 기능을 활용하고 싶다면 PySide6가 더 나은 선택일 수 있습니다.
단점은 커뮤니티 크기입니다. PyQt가 더 오래되었기 때문에 Stack Overflow나 블로그의 예제 코드 대부분이 PyQt 기준입니다. PySide 관련 문제를 검색하면 PyQt 답변이 나오는 경우가 많고, import를 바꿔서 적용해야 합니다. 하지만 두 라이브러리가 워낙 비슷해서 큰 문제는 아닙니다.
2025년 기준으로 새 프로젝트를 시작한다면 PySide6를 권장합니다. 라이선스 걱정 없이 Qt의 모든 기능을 사용할 수 있습니다.
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget
app = QApplication([])
window = QMainWindow()
window.setWindowTitle("PySide6 예제")
window.setGeometry(100, 100, 400, 300)
centralWidget = QWidget()
layout = QVBoxLayout()
label = QLabel("Hello, PySide6!")
label.setStyleSheet("font-size: 20px; padding: 20px;")
layout.addWidget(label)
button = QPushButton("클릭")
button.clicked.connect(lambda: print("클릭됨"))
layout.addWidget(button)
centralWidget.setLayout(layout)
window.setCentralWidget(centralWidget)
window.show()
app.exec()
🔗 공식 사이트: https://www.qt.io/qt-for-python
Qt for Python (PySide6) | Official Python Bindings
The official Qt set of Python bindings and a binding generator. No need to know C++. Take a shortcut to cross-platform development for UI and middleware.
www.qt.io
🔗 튜토리얼: https://www.pythonguis.com/pyside6-tutorial/
PySide6 Tutorial 2026, Create Python GUIs with Qt
The easy way to create desktop applications. PySide, also known as Qt for Python, is a Python library for creating GUI applications using the Qt toolkit.
www.pythonguis.com
5. wxPython
한 줄 요약: 운영체제 네이티브 컨트롤을 사용해서 가장 "원래 있던 앱처럼" 보이는 라이브러리
wxPython은 wxWidgets라는 C++ GUI 라이브러리의 파이썬 바인딩입니다. wxWidgets의 특징은 각 운영체제의 네이티브 UI 컨트롤을 직접 사용한다는 점입니다. Windows에서 실행하면 Windows 버튼이, macOS에서 실행하면 macOS 버튼이 그려집니다. Qt나 Tkinter처럼 자체적으로 위젯을 그리는 게 아니라, 운영체제가 제공하는 실제 컨트롤을 사용합니다.
이 접근 방식의 장점은 앱이 운영체제에 완벽히 녹아든다는 것입니다. Windows 사용자에게는 Windows 앱처럼, macOS 사용자에게는 macOS 앱처럼 보입니다. 시스템 설정(접근성, 고대비 모드 등)도 자동으로 따릅니다. 기업용 내부 도구처럼 "운영체제 표준을 따르는 것이 중요한" 상황에서 유리합니다.
단점은 플랫폼마다 미묘하게 다르게 동작할 수 있다는 점입니다. 같은 코드가 Windows와 macOS에서 약간 다른 레이아웃으로 보일 수 있습니다. 또한 API가 C++ 스타일이라서 파이써닉하지 않다는 평가도 있습니다. 학습 곡선도 Qt 계열과 비슷하게 가파른 편입니다.
라이선스는 wxWindows License로, LGPL과 비슷하게 상업적 사용에 제한이 없습니다. 네이티브 외관이 중요하고, Qt의 라이선스나 크기가 부담된다면 wxPython이 좋은 대안입니다.
import wx
app = wx.App()
frame = wx.Frame(None, title="wxPython 예제", size=(400, 300))
panel = wx.Panel(frame)
vbox = wx.BoxSizer(wx.VERTICAL)
label = wx.StaticText(panel, label="Hello, wxPython!")
font = label.GetFont()
font.PointSize = 16
label.SetFont(font)
vbox.Add(label, flag=wx.ALL | wx.CENTER, border=20)
button = wx.Button(panel, label="클릭")
button.Bind(wx.EVT_BUTTON, lambda e: print("클릭됨"))
vbox.Add(button, flag=wx.CENTER)
panel.SetSizer(vbox)
frame.Show()
app.MainLoop()
🔗 공식 사이트: https://wxpython.org/
Welcome to wxPython!
All about wxPython, the cross-platform GUI toolkit for the Python language
wxpython.org
🔗 문서: https://docs.wxpython.org/
wxPython API Documentation — wxPython Phoenix 4.2.3 documentation
wxPython API Documentation Welcome! This is the API reference documentation for the 4.2.3 release of wxPython Phoenix, built on 10 April 2025. If you are porting your code from Classic wxPython, be sure to read the Migration Guide to get a better feel for
docs.wxpython.org
2부: 현대적 라이브러리
6. Kivy
한 줄 요약: 터치 인터페이스와 모바일 배포를 지원하는 유일한 파이썬 GUI 프레임워크
Kivy는 다른 GUI 라이브러리와 철학이 다릅니다. 데스크톱뿐 아니라 Android, iOS 앱까지 하나의 코드베이스로 만들 수 있도록 설계되었습니다. 터치 제스처(스와이프, 핀치 줌 등)를 네이티브로 지원하고, 멀티터치도 처리합니다.
Kivy의 외관은 운영체제와 완전히 독립적입니다. 자체 렌더링 엔진을 사용해서 모든 위젯을 직접 그립니다. 기본 테마는 평면적이고 현대적인 디자인이며, KivyMD 같은 서드파티 테마로 Material Design 스타일을 적용할 수도 있습니다. 단점은 데스크톱에서 "운영체제 네이티브 앱"처럼 보이지 않는다는 점입니다.
KV 언어라는 선언적 UI 정의 방식을 제공합니다. 파이썬 코드와 UI 정의를 분리할 수 있어서 코드가 깔끔해집니다. 하지만 KV 언어를 배워야 한다는 추가 학습 부담이 있습니다.
모바일 배포는 Buildozer라는 도구를 사용합니다. 완벽하지는 않아서 설정에 시행착오가 필요할 수 있고, iOS 배포는 macOS가 필요합니다. 그래도 "파이썬으로 모바일 앱"이라는 목표에 가장 가까운 옵션입니다.
MIT 라이선스로 상업적 사용에 제한이 없습니다. 터치 인터페이스가 필요하거나, 같은 코드로 데스크톱과 모바일을 모두 지원하고 싶다면 Kivy가 유일한 선택입니다.
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
class MyApp(App):
def build(self):
layout = BoxLayout(orientation='vertical', padding=20, spacing=10)
label = Label(text="Hello, Kivy!", font_size=24)
layout.add_widget(label)
button = Button(text="클릭", size_hint=(1, 0.3))
button.bind(on_press=lambda x: print("클릭됨"))
layout.add_widget(button)
return layout
MyApp().run()
🔗 공식 사이트: https://kivy.org/
Kivy: Cross-platform Python Framework for NUI
Open source Python framework for rapid development of applications that make use of innovative user interfaces, such as multi-touch apps.
kivy.org
7. Dear PyGui
한 줄 요약: GPU 가속 렌더링으로 대시보드, 데이터 시각화, 게임 툴에 최적화된 즉시 모드 GUI
Dear PyGui는 게임 개발에서 사용하는 Dear ImGui의 파이썬 바인딩을 확장한 라이브러리입니다. "즉시 모드(Immediate Mode)" GUI라는 독특한 패러다임을 사용합니다. 전통적인 GUI는 버튼 객체를 만들고 콜백을 연결하는 "유지 모드(Retained Mode)"인데, 즉시 모드는 매 프레임마다 UI를 다시 그리는 방식입니다.
이 방식의 장점은 동적으로 변하는 UI를 만들기 쉽다는 것입니다. 실시간 데이터 대시보드, 디버깅 도구, 게임 내 개발자 콘솔 같은 용도에 적합합니다. GPU 가속을 사용해서 수천 개의 플롯 포인트도 부드럽게 렌더링합니다.
코드 스타일이 다른 GUI 라이브러리와 상당히 다릅니다. 위젯을 변수에 저장하지 않고, 컨텍스트 매니저 안에서 선언합니다. 처음에는 낯설지만, 익숙해지면 간결하게 UI를 정의할 수 있습니다.
단점은 "일반적인 데스크톱 앱" 용도로는 부적합하다는 점입니다. 파일 다이얼로그, 메뉴바, 시스템 트레이 아이콘 같은 표준 데스크톱 기능이 제한적입니다. 데이터 시각화 도구, 개발자 유틸리티, 프로토타이핑에 적합하고, 사용자용 제품 앱에는 다른 라이브러리가 나을 수 있습니다.
MIT 라이선스이고 활발하게 개발되고 있습니다.
import dearpygui.dearpygui as dpg
dpg.create_context()
dpg.create_viewport(title="Dear PyGui 예제", width=400, height=300)
with dpg.window(label="메인 윈도우", width=380, height=280):
dpg.add_text("Hello, Dear PyGui!")
dpg.add_button(label="클릭", callback=lambda: print("클릭됨"))
dpg.add_input_text(label="입력", hint="텍스트 입력...")
dpg.add_slider_float(label="슬라이더", default_value=0.5)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
🔗 GitHub: https://github.com/hoffstadt/DearPyGui
GitHub - hoffstadt/DearPyGui: Dear PyGui: A fast and powerful Graphical User Interface Toolkit for Python with minimal dependenc
Dear PyGui: A fast and powerful Graphical User Interface Toolkit for Python with minimal dependencies - hoffstadt/DearPyGui
github.com
8. Flet
한 줄 요약: Flutter를 파이썬에서 사용할 수 있게 해주는 프레임워크, 웹/데스크톱/모바일 모두 지원
Flet은 구글의 Flutter 프레임워크를 파이썬에서 사용할 수 있게 해주는 도구입니다. Flutter는 다트(Dart) 언어로 작성하지만, Flet을 쓰면 파이썬으로 Flutter 앱을 만들 수 있습니다. 같은 코드로 데스크톱, 웹, 모바일 앱을 모두 빌드할 수 있습니다.
Flet의 외관은 Material Design을 기본으로 합니다. 구글 앱들과 비슷한 현대적이고 깔끔한 디자인이 기본으로 적용됩니다. 애니메이션과 전환 효과도 부드럽습니다. Flutter의 위젯 시스템을 그대로 사용하기 때문에 위젯 종류도 풍부합니다.
웹 배포가 특히 간편합니다. flet publish 명령 한 줄로 정적 웹사이트를 생성할 수 있고, Flet Cloud에 배포하면 URL로 바로 접근할 수 있습니다. 데스크톱 앱으로 패키징하는 것도 flet pack 명령으로 간단합니다.
단점은 아직 젊은 프로젝트라는 점입니다. 2022년에 시작되어 빠르게 발전하고 있지만, Qt 같은 성숙한 프레임워크에 비하면 문서와 커뮤니티가 부족합니다. 또한 Flutter 런타임에 의존하기 때문에 앱 크기가 큰 편입니다.
MIT 라이선스로 상업적 사용에 제한이 없습니다. 현대적인 디자인과 크로스 플랫폼 배포가 중요하다면 Flet이 좋은 선택입니다.
import flet as ft
def main(page: ft.Page):
page.title = "Flet 예제"
page.vertical_alignment = ft.MainAxisAlignment.CENTER
def buttonClick(e):
print("클릭됨")
page.add(
ft.Text("Hello, Flet!", size=24, weight=ft.FontWeight.BOLD),
ft.ElevatedButton("클릭", on_click=buttonClick),
ft.TextField(label="텍스트 입력", hint_text="입력하세요...")
)
ft.app(target=main)
🔗 공식 사이트: https://flet.dev/ 🔗 문서: https://flet.dev/docs/
Build multi-platform apps in Python | Flet
Build multi-platform apps in Python
flet.dev
9. PySimpleGUI (주의: 2024년 유료화)
한 줄 요약: 복잡한 GUI 코드를 극단적으로 단순화한 래퍼, 하지만 2024년부터 유료화되어 신규 프로젝트에 비권장
PySimpleGUI는 Tkinter, Qt, wxPython, 웹(Remi) 등 여러 GUI 백엔드를 감싸서 통일된 심플한 API를 제공하는 라이브러리였습니다. 5~10줄의 코드로 GUI를 만들 수 있다는 것이 핵심 가치였습니다. 파이썬 입문자나 "GUI는 필요하지만 배우는 데 시간 쓰고 싶지 않다"는 개발자에게 인기가 있었습니다.
문제는 2024년에 라이선스가 바뀌었다는 점입니다. 이전에는 LGPL이었지만, 현재는 상업적 사용에 연간 $99의 라이선스 비용이 발생합니다. 비상업적 사용은 무료이지만, 회사에서 내부 도구를 만들 때도 비용이 들 수 있습니다.
또한 개발이 활발하지 않고, 문서 구조가 혼란스럽다는 비판도 있습니다. 커뮤니티에서 개발자의 태도에 대한 불만도 종종 나옵니다.
2025년 기준으로 신규 프로젝트에는 PySimpleGUI를 권장하지 않습니다. 비슷한 심플함을 원한다면 Flet이나 CustomTkinter가 더 나은 대안입니다. 기존에 PySimpleGUI로 작성된 코드를 유지보수해야 하는 경우에만 사용을 고려하세요.
import PySimpleGUI as sg
layout = [
[sg.Text("Hello, PySimpleGUI!")],
[sg.Input(key="-INPUT-")],
[sg.Button("클릭"), sg.Button("종료")]
]
window = sg.Window("PySimpleGUI 예제", layout)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == "종료":
break
if event == "클릭":
print(f"입력값: {values['-INPUT-']}")
window.close()
🔗 공식 사이트 (유료화 후) : https://www.pysimplegui.com/
PySimpleGUI
PySimpleGUI Shutdown --> We gave it our best shot…. After 7 years of attempting to make the PySimpleGUI project sustainable, we are stopping the PySimpleGUI project. If you've followed the project over the years, you'll have read about the difficulties t
www.pysimplegui.com
10. Toga (BeeWare)
한 줄 요약: 네이티브 UI 컨트롤을 사용하면서 크로스 플랫폼 앱을 만드는 BeeWare 프로젝트의 GUI 툴킷
Toga는 BeeWare 프로젝트의 일부로, "파이썬으로 네이티브 앱을 만든다"는 목표를 가지고 있습니다. wxPython처럼 각 플랫폼의 네이티브 UI 컨트롤을 사용하지만, 더 현대적인 API와 모바일 지원을 제공합니다.
BeeWare의 핵심 도구인 Briefcase와 함께 사용하면 Windows, macOS, Linux 데스크톱 앱은 물론이고 Android, iOS 앱까지 패키징할 수 있습니다. 각 플랫폼에서 네이티브 UI를 사용하기 때문에 "파이썬으로 만들었다"는 느낌이 들지 않습니다.
단점은 아직 성숙하지 않다는 점입니다. 위젯 종류가 제한적이고, 일부 플랫폼에서 기능이 불완전합니다. 문서도 Qt 계열에 비하면 부족합니다. BeeWare 팀이 활발하게 개발하고 있지만, 프로덕션 앱에 쓰기에는 아직 이른 감이 있습니다.
BSD 라이선스로 상업적 사용에 제한이 없습니다. 네이티브 외관과 모바일 배포가 모두 중요하고, 초기 단계의 프레임워크를 감수할 수 있다면 Toga를 시도해볼 만합니다.
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, CENTER
def build(app):
box = toga.Box(style=Pack(direction=COLUMN, padding=20, alignment=CENTER))
label = toga.Label("Hello, Toga!", style=Pack(padding_bottom=20, font_size=18))
box.add(label)
button = toga.Button("클릭", on_press=lambda w: print("클릭됨"))
box.add(button)
textInput = toga.TextInput(placeholder="텍스트 입력...", style=Pack(padding_top=20))
box.add(textInput)
return box
def main():
return toga.App("Toga 예제", "com.example.toga", startup=build)
if __name__ == "__main__":
main().main_loop()
🔗 공식 사이트: https://beeware.org/project/projects/libraries/toga/ 🔗 BeeWare: https://beeware.org/
Redirecting... https://toga.beeware.org/— BeeWare
Redirecting... https://toga.beeware.org/
beeware.org
3부: 특수 목적 라이브러리
11. PyGObject (GTK)
한 줄 요약: Linux 데스크톱(GNOME)의 표준 툴킷 GTK의 파이썬 바인딩
PyGObject는 GTK(GIMP Toolkit)를 파이썬에서 사용할 수 있게 해주는 바인딩입니다. GTK는 GNOME 데스크톱 환경의 기반이 되는 GUI 툴킷으로, Linux에서 가장 널리 사용됩니다. GIMP, Inkscape, GNOME 앱들이 모두 GTK로 만들어졌습니다.
GTK의 강점은 Linux에서의 통합입니다. GNOME 시스템 설정, 테마, 접근성 기능이 모두 자동으로 적용됩니다. Adwaita 테마를 사용하면 다른 GNOME 앱들과 완벽히 일관된 외관을 얻습니다.
Windows와 macOS에서도 GTK를 사용할 수 있지만, 설치가 복잡하고 외관이 약간 어색합니다. 네이티브 느낌을 주지 못합니다. 따라서 GTK는 Linux 전용 앱에 가장 적합합니다.
GTK4는 최신 버전으로 많은 개선이 이루어졌지만, 기존 GTK3 앱과 호환되지 않아서 마이그레이션이 필요합니다. 새 프로젝트라면 GTK4를 권장합니다.
LGPL 라이선스로 상업적 사용에 제한이 없습니다. Linux 데스크톱 앱, 특히 GNOME 환경과 잘 어울리는 앱을 만들고 싶다면 최고의 선택입니다.
import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk
def onActivate(app):
window = Gtk.ApplicationWindow(application=app, title="GTK4 예제")
window.set_default_size(400, 300)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
box.set_margin_top(20)
box.set_margin_bottom(20)
box.set_margin_start(20)
box.set_margin_end(20)
label = Gtk.Label(label="Hello, GTK4!")
box.append(label)
button = Gtk.Button(label="클릭")
button.connect("clicked", lambda b: print("클릭됨"))
box.append(button)
entry = Gtk.Entry()
entry.set_placeholder_text("텍스트 입력...")
box.append(entry)
window.set_child(box)
window.present()
app = Gtk.Application(application_id="com.example.gtk")
app.connect("activate", onActivate)
app.run(None)
🔗 공식 문서: https://pygobject.gnome.org/ 🔗 GTK: https://www.gtk.org/
Overview — PyGObject
PyGObject is a Python package which provides bindings for GObject based libraries such as GTK, GStreamer, WebKitGTK, GLib, GIO and many more. It supports Linux, Windows, and macOS and works with Python 3.9+ and PyPy3. PyGObject, including this documentatio
pygobject.gnome.org
12. Textual
한 줄 요약: 터미널에서 실행되는 현대적인 TUI(Text User Interface) 프레임워크
Textual은 GUI가 아니라 TUI(Text User Interface)를 만드는 라이브러리입니다. 터미널 안에서 마우스 클릭, 스크롤, 버튼, 입력창, 테이블 등을 구현합니다. htop, vim, 또는 최신 CLI 도구들처럼 터미널에서 풍부한 인터페이스를 제공합니다.
Textual의 놀라운 점은 웹 기술에서 영감을 받은 CSS 기반 스타일링입니다. 레이아웃, 색상, 애니메이션을 CSS와 비슷한 문법으로 정의합니다. 반응형 레이아웃도 지원해서 터미널 크기에 따라 UI가 자동으로 조절됩니다.
TUI의 장점은 SSH로 접속한 원격 서버에서도 GUI처럼 작동한다는 점입니다. 서버 관리 도구, 개발자 유틸리티, 데이터 모니터링 대시보드에 적합합니다. GUI를 설치할 수 없는 환경에서 시각적인 인터페이스를 제공할 수 있습니다.
Rich 라이브러리(터미널 출력을 예쁘게 만드는 도구)를 만든 개발자가 개발했고, Rich와 잘 통합됩니다. MIT 라이선스이고 활발하게 개발되고 있습니다.
터미널 기반 도구를 만들거나, GUI 없이 시각적인 인터페이스가 필요하다면 Textual이 정답입니다.
from textual.app import App, ComposeResult
from textual.widgets import Header, Footer, Button, Static, Input
class MyApp(App):
CSS = """
Screen {
align: center middle;
}
#container {
width: 50;
height: auto;
border: solid green;
padding: 1 2;
}
"""
def compose(self) -> ComposeResult:
yield Header()
yield Static("Hello, Textual!", id="container")
yield Input(placeholder="텍스트 입력...")
yield Button("클릭", id="click")
yield Footer()
def on_button_pressed(self, event: Button.Pressed) -> None:
if event.button.id == "click":
self.notify("클릭됨!")
if __name__ == "__main__":
app = MyApp()
app.run()
🔗 공식 사이트: https://textual.textualize.io/ 🔗 GitHub: https://github.com/Textualize/textual
Textual - Home
Textual is a TUI framework for Python, inspired by modern web development.
textual.textualize.io
마무리
파이썬 GUI 라이브러리 선택은 프로젝트의 요구사항에 따라 달라집니다. 빠른 프로토타이핑에는 CustomTkinter나 Flet, 전문 앱에는 PySide6, 모바일까지 고려한다면 Kivy나 Flet이 적합합니다. 각 라이브러리의 장단점을 이해하고 프로젝트에 맞는 도구를 선택하세요.
2025년 기준으로 새 프로젝트에 가장 많이 추천되는 조합은 다음과 같습니다. 간단한 도구는 CustomTkinter, 본격적인 앱은 PySide6, 크로스 플랫폼 배포가 중요하면 Flet입니다. 이 세 가지 중에서 선택하면 대부분의 요구사항을 충족할 수 있습니다.
파이썬 웹개발 streamlit이 쏘아올린 Pure Python Development N가지
웹 개발을 하고 싶지만 HTML, CSS, JavaScript를 배우기엔 시간이 부족하다면? 파이썬만 알면 웹 애플리케이션을 만들 수 있는 프레임워크들이 있습니다. 각각의 특색과 강점을 가진 여러가지 퓨어 파
eddm.tistory.com