03 апреля 2025

🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

Пишу об IT и на Python. https://kungurov.net, https://hmhm.wtf
Tkinter для минималистов, PyQt для серьезных щей, или Kivy для мобильных приложений? Разбираемся в топовых библиотеках для создания графических интерфейсов на Python.
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года
Данная статья является переводом. Ссылка на оригинал.

Tkinter

Tkinter
Tkinter
Оптимален для простых утилит.

Это легковесная библиотека со стандартным набором элементов управления: от простых кнопок до вкладок и индикаторов прогресса. Подходит для создания несложных приложений без дополнительных зависимостей. Работает на всех платформах, хотя интерфейс выглядит несколько устаревшим.

Разработан создателем Python Гвидо ван Россумом совместно со Стином Ламхолтом. Распространяется под лицензией Python Software Foundation, которая позволяет использовать библиотеку как в открытых, так и в проприетарных проектах.

Простое Hello-world приложение:

        import tkinter as tk

window = tk.Tk()
window.title("Hello World")


def handle_button_press(event):
    window.destroy()


button = tk.Button(text="My simple app.")
button.bind("", handle_button_press)
button.pack()

# Start the event loop.
window.mainloop()

    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

Статьи по теме

PyQt и PySide

PyQt
PyQt
Инструменты для создания профессиональных десктопных приложений.

PyQt и PySide — это обертки для фреймворка Qt, позволяющие создавать современные приложения для Windows, macOS, Linux и Android. Их главное преимущество — Qt Creator с визуальным редактором интерфейсов и обширная экосистема с документацией и поддержкой сообщества.

Qt предоставляет не просто инструменты для создания GUI, а полноценный фреймворк разработки. Помимо стандартных виджетов, он включает:

  • Способ организации кода MVC
  • Работу с базами данных
  • Построение графиков и векторную графику
  • Поддержку мультимедиа и звука
  • Интерфейсы для работы с периферией

PyQt (1998) распространяется под GPL v3, что требует открытия исходного кода приложений или покупки коммерческой лицензии. PySide (2009) под LGPL позволяет использование в закрытых проектах без дополнительных платежей.

Установка: pip install pyqt6 или pip install pyside6

Hello-world приложение на PyQt6:

        from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton

import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Hello World")

        button = QPushButton("My simple app.")
        button.pressed.connect(self.close)

        self.setCentralWidget(button)
        self.show()


app = QApplication(sys.argv)
w = MainWindow()
app.exec()
    

Hello-world приложение на PySide6:

        from PySide6.QtWidgets import QMainWindow, QApplication, QPushButton

import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Hello World")

        button = QPushButton("My simple app.")
        button.pressed.connect(self.close)

        self.setCentralWidget(button)
        self.show()


app = QApplication(sys.argv)
w = MainWindow()
app.exec()
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

PySide6:

PyQt6:

PyQt5:

🐍 Библиотека питониста
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Qt Quick/QML в PyQt и PySide

Идеальное решение для встраиваемых систем и сенсорных интерфейсов.

PyQt и PySide предлагают два подхода к созданию интерфейсов:

  • Qt Widgets — для классических десктопных приложений
  • Qt Quick/QML — декларативный подход для современных интерфейсов

Архитектура приложения разделена на:

  • Python-код для логики приложения
  • QML-файлы для описания интерфейса

Такое разделение позволяет:

  • Управлять интерфейсом из Python
  • Обрабатывать события и анимации через JavaScript

Основные области применения

  • Встраиваемые системы (Raspberry Pi)
  • Промышленные контроллеры
  • Бытовая электроника с сенсорным управлением
  • Кастомизированные десктопные приложения и игры

Установка: pip install pyqt6 или pip install pyside6

Приложение Hello World на PyQt6 с использованием QML. Сохраните файл QML в той же папке, что и файл Python, и запустите его как обычно.

main.py:

        import sys

from PyQt6.QtGui import QGuiApplication
from PyQt6.QtQml import QQmlApplicationEngine


app = QGuiApplication(sys.argv)

engine = QQmlApplicationEngine()
engine.quit.connect(app.quit)
engine.load('main.qml')

sys.exit(app.exec())

    

main.qml:

        import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 600
    height: 500
    title: "HelloApp"

    Text {
        anchors.centerIn: parent
        text: "Hello World"
        font.pixelSize: 24
    }

}
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

PyQt:

PySide:

🐍🎓 Библиотека Python для собеса
Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека Python для собеса»

Kivy

Kivy
Kivy
Идеальный фреймворк для мобильной разработки.

Ключевые особенности

  • Написан преимущественно на чистом Python (в отличие от других GUI-фреймворков)
  • Специализируется на сенсорных интерфейсах для Android и iOS
  • Работает также на Windows, macOS и Linux
  • Широкое сообщество и богатая база обучающих материалов

Возможности и компоненты

  • Высокая гибкость настройки интерфейса
  • Собственный язык разметки Kv для отделения дизайна от логики
  • Альтернатива Pygame для создания игр
  • KivyMD — дополнение с виджетами в стиле Material Design
        from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.core.window import Window

Window.size = (300, 200)


class MainWindow(BoxLayout):
    def __init__(self):
        super().__init__()
        self.button = Button(text="Hello, World?")
        self.button.bind(on_press=self.handle_button_clicked)

        self.add_widget(button)

    def handle_button_clicked(self, event):
        self.button.text = "Hello, World!"


class MyApp(App):
    def build(self):
        self.title = "Hello, World!"
        return MainWindow()


app = MyApp()
app.run()
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

Эквивалентное приложение, созданное с использованием декларативного языка Kv, показано ниже.

main.py:

        import kivy
kivy.require('1.0.5')

from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty


class Controller(FloatLayout):
    '''Create a controller that receives a custom widget from the kv lang file.

    Add an action to be called from the kv lang file.
    '''
    def button_pressed(self):
        self.button_wid.text = 'Hello, World!'


class ControllerApp(App):

    def build(self):
        return Controller()


if __name__ == '__main__':
    ControllerApp().run()
    

controller.kv:

        #:kivy 1.0

:
    button_wid: custom_button

    BoxLayout:
        orientation: 'vertical'
        padding: 20

        Button:
            id: custom_button
            text: 'Hello, World?'
            on_press: root.button_pressed()
    

Имя файла Kv должно совпадать с именем класса из основного приложения — здесь это Controller и controller.kv.

🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года
🐍🧩 Библиотека задач по Python
Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»

BeeWare Toga

BeeWare Toga
BeeWare Toga
Создание кроссплатформенных приложений с нативным интерфейсом.

BeeWare — это экосистема инструментов для разработки приложений на Python с использованием нативных элементов интерфейса. Ваши программы будут выглядеть и работать как приложения операционной системы, используя системные виджеты и стандартное поведение.

Основные компоненты

  • Toga — библиотека нативных виджетов для всех платформ
  • Briefcase — инструмент для создания готовых пакетов приложений
  • Нативные API — библиотеки для работы с системными функциями

Особенности

  • Единый код для всех платформ
  • Нативный внешний вид на каждой ОС
  • Простота развертывания через Briefcase
  • Открытый исходный код (лицензия BSD 3-Clause)

Установка: pip install toga

        import toga
from toga.style import Pack


class HelloWorld(toga.App):
    def startup(self):
        layout = toga.Box()

        self.button = toga.Button(
            "Say Hello!",
            on_press=self.say_hello,
            style=Pack(margin=5),
        )
        layout.add(self.button)

        self.main_window = toga.MainWindow(title="Hello world!")
        self.main_window.content = layout
        self.main_window.show()

    def say_hello(self, source_widget):
        # Receives the button that was clicked.
        source_widget.text = "Hello, world!"


app = HelloWorld(formal_name="Hello, world!", app_id="hello.world")
app.main_loop()
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

WxPython

WxPython
WxPython
Лучший выбор для простых настольных кроссплатформенных приложений.

WxPython представляет собой оболочку для популярного GUI-фреймворка WxWidgets. Реализован в виде набора Python-модулей расширения, которые обеспечивают работу с компонентами графического интерфейса известной кроссплатформенной библиотеки wxWidgets. Сама библиотека написана на C++.

WxPython использует системные элементы интерфейса на большинстве платформ, благодаря чему приложение естественно вписывается в интерфейс любой операционной системы.

Как WxWidgets, так и WxPython распространяются под лицензией WxWindows Library License — свободной лицензией, схожей с LGPL (с особыми условиями). Эта лицензия позволяет использовать и модифицировать WxPython как в проприетарных, так и в открытых проектах.

Установка: pip install wxpython

        import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200, -1))

        self.button = wx.Button(self, label="My simple app.")
        self.Bind(
            wx.EVT_BUTTON, self.handle_button_click, self.button
        )

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.button)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(True)
        self.Show()

    def handle_button_click(self, event):
        self.Close()


app = wx.App(False)
w = MainWindow(None, "Hello World")
app.MainLoop()
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

PyGObject (GTK+)

PyGObject (GTK+)
PyGObject (GTK+)
Оптимальный выбор для разработки приложений под GNOME.

Если вы планируете создать приложение, которое будет органично работать в GNOME и других GTK-окружениях Linux, PyGObject станет для вас оптимальным решением. Это библиотека, обеспечивающая связь Python с инструментарием GTK+. С ее помощью можно создавать современные адаптивные интерфейсы, соответствующие рекомендациям по проектированию интерфейсов GNOME (HIG).

PyGObject позволяет разрабатывать универсальные приложения, способные работать как на компьютерах, так и на мобильных устройствах с Linux на борту. Разработчикам доступны как официальные, так и сторонние инструменты от сообщества. Среди них — GNOME Builder и Glade (визуальный редактор для быстрого создания графических интерфейсов).

Библиотека распространяется под лицензией LGPL версии 2.1. Хотя эта версия отличается от текущей LGPL 3.0, она по-прежнему разрешает использование в проприетарном ПО, но требует открытия исходного кода при модификации самой библиотеки.

Установка:

  • Ubuntu/Debian: sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-4.0
  • macOS: brew install pygobject4 gtk+4
        import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk

def on_activate(app):
    win = Gtk.ApplicationWindow(application=app)
    btn = Gtk.Button(label="Hello, World!")
    btn.connect('clicked', lambda x: win.close())
    win.set_child(btn)
    win.present()

app = Gtk.Application(application_id='org.gtk.Example')
app.connect('activate', on_activate)
app.run(None)
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

Remi

Remi
Remi
Лучшее решение для создания веб-интерфейсов.

Remi (аббревиатура от REMote Interface – «удаленный интерфейс») – идеальное решение для приложений, работающих на серверах и системах без графического интерфейса, таких как Raspberry Pi. В отличие от большинства других фреймворков для создания GUI, Remi отображается в браузере благодаря встроенному веб-серверу. Это делает его по-настоящему кроссплатформенным решением, одинаково хорошо работающим на любой платформе.

Такая архитектура позволяет получить доступ к интерфейсу приложения с любого устройства с браузером в пределах одной сети. И хотя есть возможность ограничить доступ с помощью логина и пароля, по умолчанию механизмы безопасности не включены.

Важно понимать: Remi создан для разработки классических приложений с графическим интерфейсом, а не для создания веб-сайтов. При одновременном подключении нескольких пользователей они будут работать с одним и тем же интерфейсом – словно приложением пользуется один пользователь.

Для работы с Remi достаточно базовых знаний Python – код автоматически преобразуется в HTML. В комплект входит визуальный редактор с поддержкой перетаскивания элементов (drag-and-drop), похожий на Qt Designer для PyQt и PySide.

Remi распространяется под лицензией Apache License v2.0 – это «разрешительная» лицензия, схожая с MIT License. Она позволяет использовать фреймворк как в открытых, так и в проприетарных проектах, включая возможность вносить закрытые изменения в сам фреймворк. Основные требования лицензии касаются сохранения уведомлений об авторских правах и условий лицензирования.

        import remi.gui as gui
from remi import start, App

class MyApp(App):

    def main(self):
        container = gui.VBox(width=120, height=100)

        # Create a button, with the label "Hello, World!"
        self.bt = gui.Button('Hello, World?')
        self.bt.onclick.do(self.on_button_pressed)

        # Add the button to the container, and return it.
        container.append(self.bt)
        return container

    def on_button_pressed(self, widget):
        self.bt.set_text('Hello, World!')

start(MyApp)
    
🐍🎨 Собираем идеальный GUI на Python: ТОП-8 библиотек 2025 года

А какую библиотеку для создания интерфейсов на Python используете вы и почему именно ее предпочитаете остальным вариантам?

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ