Python + QT, Windows Forms или Swing для кросс-платформенного приложения?
Я хотел бы разработать кросс-платформенное приложение для малого и среднего размера (включая графический интерфейс).
Мой фон: в основном веб-приложения с архитектурой MVC, как Python (Pylons + SqlAlchemy), так и Java (хорошо знаю язык, но не нравится это так много). Я также знаю некоторые С#. Пока у меня нет опыта программирования GUI (ни Windows Forms, ни Swing, ни QT).
Я планирую использовать SQLite для хранения данных: это похоже на кросс-платформенное решение и обладает некоторыми мощными функциями (например, полнотекстовый поиск, которого не хватает SQL Server Compact).
Я провел некоторое исследование, и это мои любимые варианты:
1) QT, Python (PyQT или PySide) и SQLAlchemy
плюсы:
- Язык Python
- С открытым исходным кодом сильный в мире Python (множество библиотек и пользователей)
- SQLAlchemy: фантастический способ взаимодействия с БД и невероятно хорошо документированный!
минусы:
- сбор, распространение и развертывание сложнее?
- нет опыта QT
- Дизайнер QT не так хорош, как разработчик Visual Studio Winforms
2).NET/Mono, Windows Forms, С#, (Fluent) NHibernate, System.Data.SQLite
плюсы:
- С# (мне нравится, особенно по сравнению с Java и хотелось бы получить больше опыта в нем)
- Дизайнер GUI Winforms в Visual Studio кажется действительно гладким
- IntelliSense
- Развертывание ClickOnce (?)
- Windows Forms выглядят и чувствуют себя хорошо в Windows
минусы:
- (Fluent) NHibernate гораздо менее документирован, чем SQLAlchemy; также раздражает: Свободные документы относятся к документам NHibernate, которые относятся к Hibernate (aargh!). Но простой NHibernate + XML выглядит не очень удобно.
- Windows Forms не будет выглядеть + вести себя на Linux/Mac OS (правильно?)
- меньше библиотек с открытым исходным кодом в мире .NET, меньше пользователей OSS, меньше документации вообще
- нет опыта WinForms и NHibernate
3) JVM, Java + Jython, Swing, SQLAlchemy
(Я эмоционально предвзято отношусь к этому, но указан для полноты)
плюсы:
- JVM/Swing хорошо работают как кросс-платформенная основа.
- Jython
- SQLAlchemy
- множество библиотек с открытым исходным кодом
минусы:
- Свинг кажется уродливым и трудным для макета
- отсутствует хороший дизайнер GUI.
- Угадай, что я не смогу избежать Java для создания пользовательского интерфейса.
- Не уверен, насколько стабильна интеграция Jython/Java
(Варианты, которые я исключил... просто чтобы не обсуждать их):
- wxWidgets/wxPython (теперь QT является LGPLed)
- GTK/PyGTK
Внешний вид окончательного приложения очень важен для меня. Вышеупомянутые технологические стеки очень разные (PyQT,.NET WinForms, JVM Swing) и требуют некоторого времени для получения опыта, поэтому:
Какой вариант вы бы порекомендовали и почему?
Ответы
Ответ 1
Я парень Python и сам использую PyQt, и я могу полностью рекомендовать его. Что касается ваших минусов:
компиляция, распространение и развертывание сложнее?
Нет, не совсем. Для многих проектов полный setup.py
для, например, cx_Freeze может быть меньше 30 строк, которые редко нужно изменять (большинство зависимостей import
обнаруживаются автоматически, только нужно указать несколько модулей, которые не распознаются), а затем python setup.py
будет создавать автономный исполняемый файл. Затем вы можете распространять его так же, как, например, С++.exe.
нет опыта QT
У меня не было впечатления от GUI, когда я начал с Qt (только немного возился с Tkinter), но я полюбил Qt. В большинстве случаев все виджеты работают без сбоев и делают то, что они должны делать, и их много для многих целей. Вы называете это, вероятно, виджет, который делает это, и не раздражает пользователя, будучи наполовину похожим. Все хорошие вещи, которые мы испортили, есть.
Qt огромен, но документация PyQt отвечает на большинство вопросов при разумных усилиях поиска. И если все остальное терпит неудачу, и вы знаете немного С++, вы также можете посмотреть ресурсы Qt.
Конструктор QT не так хорош, как дизайнер Winforms Visual Studio
Я не знаю конструктора VS Winforms, но я должен признать, что Qt Designer отсутствует. В итоге я создал эскиз пользовательского интерфейса в дизайнере, создав код, очистив его и заботясь о всех остальных деталях вручную. Пока это работает, но мои проекты довольно малы.
PS:
(теперь, когда QT является LGPLed)
PyQt остается только GPL. PySide - LGPL, да, но это не так зрело, если это беспокойство. На веб-сайте проекта говорится, что "запуск разработки на PySide теперь должен быть довольно безопасным".