Знакомство с Python в .NET на примере WPF

Язык программирования Python имеет несколько реализаций.

Основная из них, «обычный» Python (или CPython), была создана Гвидо Ван Россумом в 1991 году. Она считается «эталонной» и когда изучают или говорят о Python в подавляющем большинстве случаев подразумевают именно её. Но, «эталонная» вовсе не означает «единственная». Для написания программ широко используются и другие реализации. В частности, IronPython, который позволяет разрабатывать приложения на Python для .NET Framework.

IronPython пока поддерживает только «классическую» разработку для Windows и то с ограничениями (консольные приложения, WinForms, WPF), но возможно в будущем ситуация изменится.

Рассмотрим работу с IronPyton на примере простого WPF приложения.

В этом приложении будут три элемента: текстовое поле (TextBox), надпись (Label) и кнопка (Button).

По мере набора текста он будет автоматически отображаться в надписи, а по нажатию на кнопку он же будет отображаться в окне сообщения (MessageBox).

В качестве IDE в данной статье будет использоваться Visual Studio 2017. По умолчанию в ней отсутствует поддержка Python и поэтому перед началом работы е необходимо установить.

Процесс установки поддержки Python для Visual Studio 2017 уже был подробно описан ранее в отдельной статье (если вы используете Visual Studio 2015, описание установки поддержки Python вы можете найти здесь).

После установки, в окне создания нового проекта появится раздел Python. Выбираем в нём «Приложение WPF IronPython» и задав нужное имя проекта создаём проект.

Создание нового проекта IronPython

Далее размещаем элементы управления на форме.

С точки зрения XAML никаких отличий от других WPF приложений нет. Но, в программном коде даже столь скромной программы уже есть ряд особенностей.

Рассмотрим основные из них.

Во-первых, в IronPython по умолчанию классы импортируются выборочно. Поэтому, сразу импортируем класс для окна сообщения.

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

Данное обстоятельство является наследием CPython и при переходе с других языков программирования для .NET к этому придётся привыкнуть.

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

Ниже приведён пример обработки события TextChanged для рассматриваемой программы. Так выглядит корректное обращение к надписи на форме:

А, вот так работать не будет:

И наконец в-четвёртых, в программе нет «главного» файла с кодом, в котором располагается точка входа. Функция main находится в том же файле что и код главного окна.

Последнее необходимо обязательно помнить и учитывать при проектировании архитектуры приложения или его модернизации.

Ради интереса добавим в программу ещё одно окно. Для простоты, в качестве примера пусть это будет пустое окно.

XAML код окна:

Код окна на IronPython

Добавим кнопку для его вызова на главное и окно и обработаем событие её нажатия (не забываем об импорте класса окна).

Теперь при нажатии на кнопку теперь в центре экрана будет отображаться диалоговое окно.

В итоге у нас получилась следующая программа (код приведён только для главного окна, так как дочернее окно полностью описано выше).

XAML:

IronPython:

Что можно в целом сказать по итогам нашего знакомства с IronPython.

Разработка на Python для .NET имеет место быть. В принципе IronPython можно рассматривать даже в качестве своего рода альтернативы PyQt в области создания программ с графическим интерфейсом. Тем более, что IronPython поддерживается Mono.

К слову, в IronPython доступны, как минимум все стандартные элементы управления для окон.

При помощи IronPython программисты Python могут разрабатывать приложения для .NET не переучиваясь на VB.NET или C#. Аналогично программистам, которые ранее работали с традиционными .NET языками в IronPython многое будет привычным.

Программы на IronPython получаются даже более компактными благодаря отсутствию N-го количества служебных файлов.

Также IronPython позволяет использовать сильные стороны Python в .NET разработке.

Но, не всё так гладко, как хотелось бы.

Помимо отсутствия поддержки web разработки, IronPython всё ещё остаётся интерпретируемым языком. Программы на IronPython не компилируются в исполняемые файлы, а так и остаются в виде исходных текстов.

Поэтому для работы приложения написанного на IronPython необходим интерпретатор. А, непосредственно сам запуск программы на выполнение возможен только или через командную строку, или при помощи специальной программы загрузчика, которая по существу будет выполнять туже самую команду, только автоматически.

В IronPython пока ещё не налажена нативная поддержка кода, написанного на других .NET языках. Задействовать к проекту библиотеку, написанную на том же C# будет не просто.

Кроме того, даже в Visual Studio 2017 средства для работы с IronPython всё ещё нуждаются в совершенствовании.

Так стоит ли изучать IronPython? Определённо стоит.

Изучение IronPython позволяет .NET и Python программистам открыть новые горизонты в своей работе за счёт использования ранее не доступных возможностей. Также стоит отметить, что IronPython всё-таки достаточно молодая технология (согласно GitHub, первый релиз 0.3.0 был выпущен в марте 2009 года) и несмотря на открытый характер разработки она живёт и развивается (в настоящее время идёт разработка IronPython 3). Потому не исключено, что спустя некоторое время существующие издержки уйдут в прошлое и IronPython займёт достойное место среди других языков программирования для .NET.

4 комментария

  1. Спасибо за статью.
    Вопрос — запускаю простую форму, она выполняется, и сразу закрывается.
    Что не так?
    ———————
    import wpf

    from System.Windows import Application, Window

    class MyWindow(Window):
    def __init__(self):
    wpf.LoadComponent(self, 'WpfApplication2.xaml')

    if __name__ == '__main__':
    Application().Run(MyWindow())

    1. В своём ответе я могу исходить только из того кода, что Вы привели в своём комментарии.
      В IronPython, также как и в «обычном» Python, нет специальных операторов для обозначения тела класса или метода. Эту роль играют пробелы от начала строки. По сути, у Вас одна и та же синтаксическая ошибка повторяется несколько раз.
      IronPython интерпретируемый язык, поэтому привычной ошибки при компиляции не выдаётся.
      К слову, если Вы используете PTVS, то он ошибки синтаксиса проверяет практически на лету и выводит предупреждение перед запуском программы, если таковые имеются.

  2. IronPython развивается очень медленно. Всё говорит о том, что не стоит на него рассчитывать как на реализацию Python под .Net. Или я не прав?

    1. По моему субъективному мнению, Python под .NET это пока вообще скорее на любителя. По сути Python под .NET, это узкое сообщество, которое возникло и развивается на стыке этих двух областей.

      В данный момент полностью использовать возможности .NET можно лишь в «родных» языках от Microsoft. Аналогично, все серьёзные проекты на основе Python пишут с использованием его «классической» реализации.

      В то же время Iron Python достаточно стабилен и давно поддерживается Microsoft. Его поддержка интегрирована в PTVS и для него доступны шаблоны приложений WPF и Windows Forms. Всё это значительно упрощает жизнь разработчику.

      Таким образом на что рассчитывать в этой сфере думайте сами.

Добавить комментарий для Дмитрий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *