Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Знакомство С Python В .net На Примере Wpf

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
Язык программирования Python имеет несколько реализаций.

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

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, который позволяет разрабатывать приложения на 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» и задав нужное имя проекта создаём проект.


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



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

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WpfApplication1" Height="137" Width="300">
<Grid>
<Button x:Name="button" Content="Test" HorizontalAlignment="Left" Margin="22,69,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="22,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="textBox_TextChanged"/>
<Label x:Name="label" Content="" HorizontalAlignment="Left" Margin="22,38,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.789,0.346" Width="120" BorderBrush="#FFF70B0B"/>
</Grid>
</Window>

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

# Подключение модулей и импорт классов
import wpf
from System.Windows import Application, Window, MessageBox
# Класс формы
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent(self, 'WpfApplication1py.xaml')

def button_Click(self, sender, e):
MessageBox.Show(self.textBox.Text)

def textBox_TextChanged(self, sender, e):
self.label.Content=self.textBox.Text

# Точка входа в программу
if __name__ == '__main__':
Application().Run(MyWindow())

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

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

from System.Windows import Application, Window, MessageBox

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

def button_Click(self, sender, e):
pass

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

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

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

def textBox_TextChanged(self, sender, e):
self.label.Content=self.textBox.Text

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

def textBox_TextChanged(self, sender, e):
label.Content=self.textBox.Text

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

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

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

XAML код окна:

<Window xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Title="Window2" Height="74.79" Width="240.336" WindowStartupLocation="CenterScreen">
<Grid>
</Grid>
</Window>

Код окна на IronPython

import wpf

from System.Windows import Window

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

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

from Window2 import *
. . .
def buttonWindow2_Click(self, sender, e):
form = Window2()
form.ShowDialog()

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

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

XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WpfApplication1" Height="137" Width="300">
<Grid>
<Button x:Name="button" Content="Test" HorizontalAlignment="Left" Margin="22,69,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="22,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="textBox_TextChanged"/>
<Label x:Name="label" Content="" HorizontalAlignment="Left" Margin="22,38,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.789,0.346" Width="120" BorderBrush="#FFF70B0B"/>
<Button x:Name="buttonWindow2" Content="Window2" HorizontalAlignment="Left" Margin="102,69,0,0" VerticalAlignment="Top" Width="75" Click="buttonWindow2_Click"/>
</Grid>
</Window>

IronPython:

# Подключение модулей и импорт классов
import wpf
from System.Windows import Application, Window, MessageBox
# Класс формы
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent(self, 'WpfApplication1py.xaml')

def button_Click(self, sender, e):
MessageBox.Show(self.textBox.Text)

def textBox_TextChanged(self, sender, e):
self.label.Content=self.textBox.Text

def buttonWindow2_Click(self, sender, e):
form = Window2()
form.ShowDialog()

# Точка входа в программу
if __name__ == '__main__':
Application().Run(MyWindow())

Что можно в целом сказать по итогам нашего знакомства с 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.
 
Вверх