Dear PyGui принципиально отличается от других фреймворков GUI Python. Рендеринг на GPU, более 70 виджетов, встроенная поддержка асинхронности — это лишь некоторые возможности Dear PyGui. Руководством по работе с этим пакетом делимся к старту курса по разработке на Python. Парадигма Retained Mode позволяет создавать чрезвычайно динамичные интерфейсы. Dear PyGui не использует нативные виджеты, а рисует с помощью видеокарты компьютера, как PyQt (используя API рендеринга DirectX11, Metal и Vulkan). По сравнению с другими библиотеками Python GUI Dear PyGui уникален: Рендеринг на GPU. Простая встроенная поддержка асинхронных функций. Полное управление темами и стилями. Простое встроенное окно логирования. 70+ виджетов, сотни их комбинаций. Подробная документация, примеры и беспрецедентная поддержка. Темы — 10 встроенных тем и система пользовательских тем. Graphing — API для работы с графиками (обертка ImPlot). Canvas — низкоуровневый API для рисования. Logging — API логирования. Виджеты — просто прокрутите вниз, чтобы увидеть их. Убедитесь, что у вас установлен как минимум Python 3.7 (64 бит). Dear ImGui CPython ImPlot CLI11 Dear PyGui предоставляет разработчикам python простой способ создания быстрых и мощных графических интерфейсов для скриптов. Dear PyGui состоит из окна программы, окон и виджетов. Окно программы является главным окном вашей программы и создаётся в конце основного скрипта вызовом start_dearpygui(). Результат:  В приведённом ниже примере программы показано окно программы и ещё одно окно, в котором с помощью встроенной функции документации отображается документация: Dear PyGui состоит из двух модулей: dearpygui.core и dearpygui.simple. dearpygui.core содержит базовую функциональность Dear PyGUI. Через ядро можно делать всё. На самом деле это расширение на языке Си, просто обёрнутое в модуль. dearpygui.simple содержит обёртки и утилиты уже из кода ядра для удобства работы с Dear PyGui. В Dear PyGui есть полезные инструменты разработки. Метод show_source() принимает имя входного файла Python. Мощный инструмент разработки — Logger, он вызывается методом show_logger(). Уровней логирования 6: Trace, Debug, Info, Warning, Error, Off. Логгер выведет установленный уровень и отфильтрует все уровни ниже. Уровень лога mvTRACE покажет все команды. Элементы библиотеки можно разделить на: обычные предметы: поля ввода, кнопки; контейнеры (окно, всплывающее окно, всплывающая подсказка, элемент-потомок); элементы макета (группа, следующая колонка (next_column)). Элементы добавляются командами с префиксом add_. Каждый элемент должен иметь уникальное имя. По умолчанию, если это применимо, имя станет меткой элемента. При желании можно изменить метку: Поставьте ## после имени (например displayed_name##unique_part). Всё после ## в отображаемом имени будет скрыто. Ключевое слово label, которое отобразит метку вместо имени. Некоторые имена элементов автоматически генерируются для элементов без аргументов имени в функции (т. е. same_line). Но у них есть необязательное ключевое слово name, и его можно заполнить, когда понадобится ссылка на элемент. Контекстные менеджеры dearpygui.simple автоматизируют вызов функции end, позволяют сворачивать код и в самом коде показывают иерархию. По умолчанию элементы создаются в порядке их описания в коде. Но, указав контейнер parent, элементы можно добавлять не по порядку. parent вставляет виджет в конец списка дочерних элементов родителя. before в сочетании с ключевым словом parent помещает один элемент перед другим в списке элементов-потомков. Каждый виджет ввода имеет значение, которое можно задать с помощью ключевого слова default_value при создании или во время выполнения команды set_value. Для доступа к значению виджета можно использовать команду get_value. Мы также можем передавать значение виджета непосредственно в переменную python и из неё. Каждый элемент ввода имеет обратный вызов, который выполняется при взаимодействии с виджетом. Обратные вызовы добавляют виджетам функциональность. Они могут присваиваться до или после создания элемента функцией set_item_callback, как в коде ниже. Каждый обратный вызов должен принимать аргументы sender и data. sender сообщает обратному вызову имя элемента, которым он вызывается. Аргумент data применяется разными стандартными обратными вызовами для отправки дополнительных данных через определение callback_data. Виджеты оконного типа имеют специальные обратные вызовы, которые срабатывают при таких событиях, как изменение размера или закрытие окна. Обратные вызовы для конкретных окон могут быть применены к виджету любого типа окна. on_close будет запускать обратный вызов, назначенный ключевому слову, при закрытии окна, а set_resize_callback() будет запускаться при каждом изменении размера контейнера и может быть установлен на любое конкретное окно ключевым словом handler, по умолчанию это MainWindow. Если вы хотите, чтобы обратный вызов выполнялся на каждом фрейме, воспользуйтесь set_render_callback(). С помощью Dear PyGui вы можете динамически добавлять и удалять любые элементы во время выполнения программы. Это можно сделать, используя обратный вызов для выполнения команды add_* нужного элемента, указав родителя, к которому будет принадлежать элемент. По умолчанию, если не указан родительский элемент, виджет будет добавлен в MainWindow.Используя ключевое слово before при добавлении элемента, вы можете контролировать, перед каким элементом родительской группы будет находиться новый элемент. По умолчанию новый виджет помещается в конец. Когда новый виджет добавлен, в системное хранилище добавляется некое значение. По умолчанию идентификатор этого значения — имя виджета. Значения извлекаются из системы значений с помощью get_value("source name"). Меняются значения вручную, методом set_value("source name"). Чтобы виджеты разных типов значений могли использовать одно и то же значение в системе хранения, сначала должно быть создано большее значение. Помните, что вы можете хранить любой объект Python в хранилище данных, даже пользовательские типы данных. Вот так можно хранить отображение: Очень важный виджет для функциональности GUI — это бар меню. Строки меню всегда отображаются в верхней части окна и состоят в основном из: Лента главного меню. Выпадающие подменю. Конкретные элементы меню. Элементы меню добавляются слева направо, а элементы подменю — сверху вниз. Они могут быть вложенными, насколько это необходимо: Диалог выбора каталога вызывается select_directory_dialog(), которому необходим обратный вызов. Файловые диалоги вызываются open_file_dialog(), которому должен быть задан обратный вызов. Аргумент data возвращаемого обратного вызова будет заполнен списком строк из пути к папке и к файлу. Расширения — это дополнительное ключевое слово к диалогу файлов, которое позволяет отфильтровать файлы в диалоге по расширениям. В Dear PyGui есть «простые графики» и «графики», оба типа могут быть динамическими. Простые графики берут список и строят данные по оси y в зависимости от количества элементов в списке. Это могут быть линейные графики или гистограммы. В «графиках» используются координаты x и y. Вызывать их нужно командой add_plot(), затем данные могут быть добавлены в виде линейного или рассеянного ряда. Вот список возможностей: Клик с перетаскиванием панорамирует график. Клик с перетаскиванием по оси панорамирует график в одном направлении. Двойной клик масштабирует данные. Правый клик и перетаскивание увеличивают область. Двойной правый клик открывает настройки. Shift + правый клик и перетаскивание масштабирует область, заполняющую текущую ось. Прокрутка колёсика позволяет рассмотреть детали. Прокрутка колёсика по оси увеличивает только по этой оси. Можно переключать и скрывать наборы данных на легенде. Простые графики можно сделать динамическими, изменив значение вызова plot с помощью set_value(). Динамическая функция может очищать график и добавлять новые данные с помощью обратного вызова, например для рендеринга или обратного вызова элемента. В Dear PyGui есть низкоуровневый API, хорошо подходящий для рисования примитивов, пользовательских виджетов и даже динамических рисунков. Рисунок запускается вызовом add_drawing(). Начало холста — в левом нижнем углу. Рисунки имеют масштаб, начало и размер, к которым можно получить доступ и задать их. Масштаб — это множитель значений элементов x и y. Размер указывается в пикселях. На рисунках можно отображать .png, .jpg или .bmp. Изображения рисуются с помощью функции draw_image(). Хотя рисунки можно сделать динамичными, очищая и перерисовывая всё заново, предлагается метод эффективнее: чтобы сделать рисунок динамичным, мы должны использовать ключевое слово tag для обозначения элементов, которые хотим перерисовать. Затем нужно просто вызвать команду рисования, используя тот же тег. Это позволит удалить только один элемент и перерисовать его с помощью новой команды. Dear PyGui имеет встроенные часы для проверки общего времени работы. get_total_time(), возвращается общее время работы в секундах. Также с помощью команды get_delta_time() мы можем проверить время между кадрами рендеринга в секундах. Dear PyGui имеет простой API таблиц, который хорошо подходит для статических и динамических таблиц. Виджет таблицы запускается вызовом add_table(). Для редактирования виджета таблицы мы можем использовать методы add_row(), add_column(), которые добавят строку/столбец к последнему слоту таблицы. В качестве альтернативы мы можем вставить строки/столбцы с помощью insert_row(), insert_column(). Столбцы и строки вставляются в соответствии с их индексным аргументом. Если указанный индекс уже существует, то выходящие столбцы/строки будут удалены, а новая строка/столбец будет вставлена по указанному индексу. Кроме того, при добавлении или вставке строки/столбца неуказанные ячейки по умолчанию окажутся пустыми. Кроме того, заголовки и ячейки могут быть переименованы, а их значения изменены. Ячейки можно выбирать. Это означает, что мы можем применить обратный вызов к таблице и получить через отправителя данные о том, какая ячейка была выбрана, и даже получить текст внутри ячейки. Опрос ввода в Dear PyGui делается вызовом команды опроса в функции. Функция должна быть установлена на обратный вызов рендеринга окна, чтобы опрос происходил, когда это окно активно. Обратные вызовы рендеринга выполняются каждый кадр, Dear PyGui может опрашивать на предмет ввода между кадрами. get_mouse_drag_delta() get_mouse_pos() is_key_down() is_key_pressed() is_key_released() is_mouse_button_clicked() is_mouse_button_double_clicked() is_mouse_button_down() is_mouse_button_dragging() is_mouse_button_released() set_key_down_callback() set_key_press_callback() set_key_release_callback() set_mouse_click_callback() set_mouse_double_click_callback() set_mouse_down_callback() set_mouse_drag_callback() set_mouse_wheel_callback() set_render_callback() set_resize_callback() Подробности смотрите в описании API. Чтобы добиться желаемого поведения, комбинируйте методы. Для вычислений и обратных вызовов, требующих длительного времени, может быть полезно реализовать асинхронные функции или функции, выполняемые в отдельных потоках. Просто вызовите run_async_function(). Важно отметить, что запущенные с помощью команды async функции не могут вызывать другие функции API Dear PyGui. Асинхронные функции не могут получить доступ к add_data() или get_data(). Поэтому, когда необходимо передать данные в асинхронную функцию, вы должны использовать аргументы с ключевыми словами data и return handler. Любой объект Python можно сделать доступным для функции async, отправив его в функцию через data. Кроме того, любые возвращаемые данные из функции Async будут доступны через ввод data указанного обратного вызова. Когда вызывается метод асинхронной функциональности, создаётся пул потоков. Настраиваются время ожидания и количество потоков. Используя set_thread_count(), мы можем установить количество потоков в пуле, использовать set_threadpool_high_performance(), чтобы указать пулу потоков максимум потоков на компьютере пользователя. Имейте в виду, что при вызове асинхронных функций процессор будет работать на 100 %. Установить время ожидания для пула потоков можно с помощью set_threadpool_timeout(). Это уничтожит пул и освободит ресурсы через заданное время. Темы и стилизация виджетов могут применяться к отдельному виджету или приложению в целом. Вот примеры атрибутов стиля: размер шрифта; цветовая схема приложения; скругление углов. Репозиторий демонстраций Dear PyGui. Для установки необходимых зависимостей запустите в репозитории или  Dear PyGui — это простой и мощный фреймворк для создания графических интерфейсов пользователя с помощью скриптов на языке Python. Он рисует через GPU и работает на Windows 10, macOS и Linux, содержит функции графики, темы, API для пользовательских отрисовок и инструменты для разработки приложений. DearPyGui оборачивает Dear ImGui, включает дополнительные виджеты и дополнения (графики, диалоги файлов, изображения, виджет редактирования текста и т. д.), поддерживает асинхронность, добавление элементов на холст, дополнительные инструменты отладки и т. д. Планы [на 12 октября 2020]: Интерфейс в стиле ООП [вот вариант]. Гистограмма, круговая диаграмма и другие элементы. Улучшения для закрепления окон и двух вьюпортов. Виджет 3D. API персонализации виджетов. Dear PyGui. Dear PyGui на Github. Примеры. Документация. Туториалы. Вот так на Python можно сделать достойный графический интерфейс. Язык продолжает развиваться, а благодаря лаконичности и простоте превращается в швейцарский нож программиста. Если разработка на Python вам интересна, переходите на страницы наших курсов, чтобы увидеть, как мы готовим людей к началу карьеры Python-разработчика. Узнайте больше здесь. Python, веб-разработка Профессия Fullstack-разработчик на Python Курс «Python для веб-разработки» Профессия Frontend-разработчик Профессия Веб-разработчик Data Science и Machine Learning Профессия Data Scientist Профессия Data Analyst Курс «Математика для Data Science» Курс «Математика и Machine Learning для Data Science» Курс по Data Engineering Курс «Machine Learning и Deep Learning» Курс по Machine Learning Мобильная разработка Профессия iOS-разработчик Профессия Android-разработчик Java и C# Профессия Java-разработчик Профессия QA-инженер на JAVA Профессия C#-разработчик Профессия Разработчик игр на Unity От основ — в глубину Курс «Алгоритмы и структуры данных» Профессия C++ разработчик Профессия Этичный хакер А также: Курс по DevOps