Как стать автором
Обновить

Четыре способа написать Hello world, или инструменты для создания GUI на Python

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров30K
Всего голосов 56: ↑53 и ↓3+50
Комментарии61

Комментарии 61

Расскажите, пожалуйста, подробнее про PySimpleGUI. Если честно, впервые о нем слышу. Как он помогает решать вашу задачу? Ведь не просто так вы используете два инструмента для интерфейса 🤔

Тут ответ кроется в названии) Simple - простой. Эта библиотека действительно очень простая и позволяет быстро собрать простой GUI. Я например использую её для небольших скриптов, а под средние задачи использую NiceGUI, тоже очень интересное решение, основанное на веб-интерфейсе

У нас довольно простой UI, ориентированный на AI видео-аналитику. Мы выбирали по принципу, что Nuitka может скомпилировать UI в бинарник.

+100500, два равноценно отличных пакета под разные задачи. QT на Python ‒ страшный сон.

А как же wxPython?

Добрый день!

Я писал про инструменты, с которыми работал N-ое количество времени)

Расскажите, в каких задачах wxPython используете вы? В чем его особенности?

Надеюсь, не сочтут за рекламу, но самый крупный проект, который я делал (делаю) на wxPython - это программа для хранения заметок (https://jenyay.net/Soft/Outwiker). Мне в wxPython нравится, что есть встроенный веб-компонент, который под Windows использует IE или Edge, а под Linux - WebKit. Еще wxPython хорошо интегрируется с графиками из Matplotlib, если надо сделать какой-нибудь интерфейс к расчету с графиками.

wxFormBuilder - неплохой довесок для ленивых

Мне полюбился PyQtGraph для интерфейсов в научном софте, работает шустро и есть готовые хорошие компоненты с визуализацией графиков и интерактивностью. Но чтобы что-то свое написать приходится в кишках поковыряться, это да. Работает и с PySide и PyQt.

Вроде там нативные элементы управления используются под каждой ОС. Поэтому программа выглядит нативно, а не замаскирована под нативную. Если не ошибаюсь.

Писал на нём прогу с несколькими формами - ничего плохого не могу сказать.

И да, wxFormBuilder мне очень в этом помог.

Удачно я зашел! Планирую запилить себе интерфейс для робота, который делает всякие сделки на фондовом рынке. Какую тулзу лучше использовать, чтобы можно было запускать на любой платформе и чтоб умела рисовать красивые графики....и можно было создать "приятный глазу интерфейс". Смотрю в сторону Kivy но может есть другие интересные варианты. Спасибо!

Советую глянуть в сторону NiceGui. Не реклама, работаю с ним последние несколько месяцев. Позволяет достаточно быстро собрать красивый и функциональный интерфейс. Есть встроенная поддержка многих фреймворков для графиков.

>чтобы можно было запускать на любой платформе и чтоб умела рисовать красивые графики...

PySide2/6 + QML

Я писал на ткинтере полтора года назад ГУИ программку по работе. Вот часть функционала: https://github.com/Alexis-D-ff/python_duplicate_catalyst_gui (в этой версии только поиск дубликатов файлов реализован).

Не пользуйтесь им, он вас сожрёт. Лагучая древняя печка, с обрубленным функционалом. Три виджета с анимацией на экране = лаги.

Я бы на Qt писал но в 2022 для Python API не было документации.

А если задача позволяет, лучше веб приложение делать, а не это овно мамонта из 2002 (я про декстоп приложения).

неужели нашелся хоть один живой человек, любитель электрона?

если кто и любит это извращение, так только те, кто это разрабатывает и получает за это зарплату

НЛО прилетело и опубликовало эту надпись здесь

была аналогичная задача, веб морда для постргрес, похожая на твою, сделал на фласке, все тоже не сложно и я не веб программист)

Посмотри на UniGui или TmsWebCore

НЛО прилетело и опубликовало эту надпись здесь

К сожалению, да

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

Для примера: https://github.com/HemulGM/ChatGPT

- А может не писать на питоне GUI и использовать компилируемые нативно языки для создания быстрого и эффективного интерфейса?
- Да не, бред какой-то

Очевидно, что не каждому проекту нужен интерфейс, который будет потреблять на пару десятков меньше мегабайт ОЗУ) Все зависит от задачи: прочитайте статью — я описал конкретные юзкейсы, когда оптимальней было писать GUI на Python.

И что вы подразумеваете под «нативно компилируемые языки» — неужели от способа исполнения байт-кода всегда сильно зависит быстродействие и потребление памяти? Это не так: например, PyQt транскрибирует все в стандартный движок Qt, как и C++. Документация, объекты, сам движок — все идентично)

То же самое касаемо OpenGL. Неужели написанная 3D-сцена на PyOpenGL будет сильно проигрывать версии на C++?

Когда твой интерфейс статичен - конечно нет. Конечно все будет одинаково работать. Однако, как только питон начнет управлять этим интерфейсом в реальном времени, тогда и будет заметно проигрывать.

Обновление таблиц, графиков, текстового содержимого и т.д. Все это будет работает намного медленнее, чем с нативным языком.

В том числе и с OpenGL. Рисуется же не средствами питона, а самим движком. Однако, если будет много объектов, то построении кадра будет сильно страдать. Пока он переберет все объекты, пока отправит команду на передачу инструкции движку. Все это будет очень медленно.

Какие нативно компилируемые языки имеют удобную возможность создавать GUI не вникая в чуть ли не в язык в языке типа Qt (если пишешь на сях)?

Я только о imGui знаю. И то, его подключить - это целая проблема.

Делфи и два фреймворка и больше

Delphi да, но он сам по себе. Я же имею в виду более распространённые языки программирования.

А больше нету. Я удобнее не нашел

c++builder для си++ - полный аналог дельфи

для java - таких GUI-билдеров вагон и маленькая тележка

Когда пишу на C++, использую wxWidgets. Он в целом куда легковеснее Qt и без каких-либо кодогенераторов и проч.

Хороший GUI от логики приложения отеделен и уже скомпилирован.

По работе использую один и тот же интерфейс на QML из питона и C++ и разницы в отзывчивости нет вообще никакой.

Есть неплохая альтернатива TKinter: Custom TKinter. В целом тот же TKinter, но с современным интерфейсом. На официальном сайте есть нормальная документация и гайды по использованию.

Странно, за что минусы ставят за Dear PyGui? Я бы тоже его назвал.
Кто может, те конечно возьмут оригинальный Dear ImGui и будут писать на C++, но статья задала Python.

Если не изменяет память - то в свое время в komodo ide был работающий (!) gui builder для tk(inter). В последние лет уже... много обхожусь либо cli, либо webней - но тут кому какие задачи решать.

на самом деле можно юзать ТК-шный gui builder и потом его цеплять tkinter-ом..... но обычно без gui builder проще обойтись. да, прикольно, но - ну его нафиг, лучше самому код написать

Вы можете использовать сетки grid и менеджеры геометрии place и pack. Наверное, изучение этих инструментов — самый тяжелый этап при погружении в Tkinter. Особенно, если вы хотите научиться делать адаптивные интерфейсы.

На самом деле не так страшен черт как его малюют. Первое что надо помнить, что pack и grid нельзя использовать одновременно на одном виджете. А вот place позволяет размещать виджеты где угодно. Что касается pack и grid то освоив с десяток правил можно создавать адаптивные интерфейсы без проблем.

Добрый день. Сижу под виндой на IntellijIDEA. пробую импортнуть ell. Получаю ModuleNotFoundError: No module named 'eel'. Как можно поправить?

Добрый день! Установите предварительно модуль: pip3 install Eel

Пробовал как-то раз недавно использовать PyQt: не заработало даже меньшее, чем hello-world: уже "app = QApplication(sys.argv)" выдаёт:
"qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in ““ even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland‑egl, wayland, wayland‑xcomposite‑egl, wayland‑xcomposite‑glx, webgl, xcb.

Aborted”
Гугление (мне) выдаёт рекомендации типа "переустановите ту часть программы, что вы подключаете к QT".
В результате решил попробовать Kivy, которое пока работает.

+: В пет-проекте использовал Tkinter, тоже всё работало (только в плагине оказался баг, который пришлось исправить (но мой пулл-реквест до сих пор не принят)).

PySide + QML:

  1. Декларативное описание интерфейса: один раз попробуешь, на меньшее согласен не будешь.

  2. Разделение логики и интерфейса, возможность переиспользовать интерфейс из С++.

  3. Относительно легко можно делать очень продвинутый или нестандартный интерфейс.

Какое "Разделение логики и интерфейса", если вы в том же коде прописываете то, как элементы управления работают? Заполняете их и навешиваете события (реакции).

Интерфейс в .qml/.js и он ничего не знает о потрохах, все сложное - в .py/.cpp.

С контролами вы как общаетесь в .py/.cpp? Напрямую обращение к контролам или через отдельный контроллер? События где и когда навешиваются?

Через свойства и сигналы и слоты. Если рашьне не работали с Qt, то это, наверное, мало что говорит.

Представьте, что в py/cpp есть объект customer, у него есть свойство name. В декларативоном GUI на QML можно написать примерно так:
Text {
text: "Имя пользователя: " + customer.name
}

Все. Это создаст визуальный элемент отображащий имя пользователя и обновляющий его при необходимости. Явно обрабатывать изменение имени в py/cpp не надо. Можно сделать связь и в другую сторону, когда значение поля меняется в GUI и автоматически обновляется в py/cpp. И да, все это работает на практически любых платфомах и работает быстро.

Я работал с Qt и знаю про слоты и сигналы.

Однако, вот вы же напрямую указали поле объекта в коде QML. Это и есть прямая связь между кодом и интерфейсом.

QML знает о данных из cpp/py и напрямую может воздействовать на логику.

Разделение логики и интерфейса, это когда есть посредник, который разделяет логику и интерфейс. В вашем примере его просто нет.

Разделение логики и интерфейса, это когда есть посредник, который разделяет логику и интерфейс.

Нет конечно же. Разделение означает, что отвечающий за получаение данных слой ничего не знает о том, как эти данные отображаются (и отображаются ли вообще). Вы спрашивали про "обращение к контрлам" - его просто нет. Есть просто декларативный GUI.

Добавление третьей сущности ("посредника") тут ничего не меняет: при изменении названия поля "name" объекта "customer" менять придется также в двух местах. Если вы имели в виду MVC, то это про другое и также отлично используется с QML + cpp/py.

Ужас какой

Дизайн из 1995-го года.

Дизайн может и несёт на себе отпечаток 1995 года, но GUI написано с использованием SVG-графике\и, поддержка которой в tk появилась в 2006 году. Поддержка появилась в виде пакета tkpath, автором которого был Матс Бенгтссон (Mats Bengtsson):
image

Статья интересная, спасибо.

Дизайн это никак не оправдывает, и дело не в том, что он из нулевых, а в том, что он объективно некрасив и не удобен - слишком много цветов и элементов. 20-30 лет назад по другому не умели, сейчас умеют и есть шаблоны и средства делать гораздо лучше.

дело не в том, что он из нулевых, а в том, что он объективно некрасив и не удобен — слишком много цветов и элементов. 20-30 лет назад по другому не умели, сейчас умеют и есть шаблоны и средства делать гораздо лучше.

Абсолютно с вами согласен. Можно подискутировать удобно — не удобно, например, а как по другому задать параметры электронной подписи и сертификата. Но дело не в этом. Цель этой (именно этой демонстрации) показать каие есть сегодня возможности для разработки GUI. Здесь и цветовая гамма, и разнообразие геометрии и т.д.
И спасибо вам за вашу конструктивную критику.

По поводу Eel не очень наглядно. Было бы здорово, в примере, подкинуть в разметку текст из питоновского файла

можно обратить внимание на flet https://flet.dev, хоть от питона там только обертка

Для типичных задач, с которыми можно столкнуться на питоне (что-то одноразовое / простое / демонстрационное / учебное / сбоку от основного проекта), PySimpleGUI справляется. Он может работать и на базе Tk, и на базе QT, и на базе Wx, и теоретически можно через web пробросить интерфейс. Это вроде самая популярная библиотека для GUI на питоне, странно, что её нет в статье.

Для серьезного есть смысл посмотреть на tauri - более шустрый аналог electron.

Пользуюсь QT 5.11, по скорости разработки GUI пока ничего не находил, может конечно что и есть.

Пользуюсь ТкИнтер. Может быть в начале сложно, но достаточно создать базу элементов и потом их располагать на УИ просто с одного клика. Любая программа - это бизнесс логика и обслуживающие ее алгоритмы. УИ это мизерная часть работы, без разницы если для этого используется Qt или Tk. Скорость разработки в итоге примерно одинаковая.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий