sobota, 22 grudnia 2007

Silverlight 2.0 i IronPython

Zauważyłem, że popularność Pythona rośnie (nie tak szybko jak Ruby) i będzie rosła dzięki temu, że będzie jednym z popularnych języków DLR w SilverLight 2.0 Nareszcie można programować sobie w IronPython na stronach WWW dzięki takiej technologii jak Silverlight 1.1.
Zauważyłem, że Michael Foord napisał świetne wprowadzenie do programowania Silverlight 1.1 przy pomocy IronPythona
Przykłady też można znaleźć na IronPython Cookbook
Ja natomiast najpierw ściągnąłem przykłady z CodePlex (one są z kwietnia 2007 roku).
Potem ściągnąłem zestaw kodu źródłowego do SilverLight 1.1 Alpha Refresh.
Na podstawie tego kodu przerobiłem tak, żeby przykłady z CodePlex dały się uruchomić.
(głównie to polegało na zaktualizowaniu przykładów do nowszej wersji pliku Slilverlight.js)

Przykłady z CodePlex to:
Clock - pokazuje jak zaprogramować zegar. Celem tego przykładu jest pokazanie jak może współpracować z XAML
DLRConsole - zaawansowany przykład który pokazuje jak można zaprogramować na stronie internetowej własne środowisko wykonawcze pozwalające na uruchamianie własnych skryptów IronPythona na stronie internetowej
Flaculator - kalkulator, który pokazuje w sposób bardzo przystępny działanie na nawiasach czy złożonych operacjach matematycznych na ułamkach
GrandPiano - pozwala na zaprogramowanie dźwięków poprzez symulację pianina
PhotoViewer - przeglądarka plików graficznych
WordFind - wyszukiwarka tekstów na stronie i podświetla znalezione słowa

Zrobiłem 3 przykłady aby pokazać jaką elastyczność posiada SilverLight jak zacznie się programować z językami DLR
Kod dokumentu  XHTML  jest taki sam

<html>
<head>
<title>Kurs IronPython z Silverlight Project</title>
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript">
function CreateSilverlight()

     Silverlight.createObject("first.xaml",
                              document.getElementById('SilverlightControlHost'),
                              "SilverlightControl",
                              {width: '1000', height: '1000', version: '1.1'},
                              {onError: null, onLoad: null},
                              null);
}
</script>
</head>
    <body>
    <div id="SilverlightControlHost">
        <script type="text/javascript">
            CreateSilverlight();
        </script>
    </div>
    </body>
</html>
 
Pierwszy przykład to czysty XAML w pliku first.xaml

<Canvas
   xmlns="http://schemas.microsoft.com/client/2007"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   
  <Ellipse Height="200" Width="200"
    Stroke="Black" StrokeThickness="10" Fill="SlateBlue" />
</Canvas>

Drugi przykład to załadowanie pliku XAML przez IronPythona w pliku second.xaml

<Canvas
   xmlns="http://schemas.microsoft.com/client/2007"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <x:Code Source="second.py" Type="text/python" />
   <Canvas x:Name="Root" Loaded="OnLoad" />
</Canvas>

Kod z second.py

def OnLoad(sender, event):
    t = XamlReader.Load("first.xaml")
    Root.Children.Add(t)

Trzeci przykład to wygenerowanie z poziomu programowania w IronPythonie w pliku third.xaml

<Canvas
   xmlns="http://schemas.microsoft.com/client/2007"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Width="200" Height="200" Background="LimeGreen">
   <x:Code Source="third.py" Type="text/python" />
   <Canvas x:Name="Root" Loaded="OnLoad" />
</Canvas>

Kod z third.py

from System.Windows import DependencyObject
from System.Windows.Controls import TextBlock, Canvas
from System.Windows.Shapes import Ellipse
from System.Windows.Media import SolidColorBrush
from System.Windows.Media import Colors

# Taken from DLRConsole
# A typed way to set properties
SetIntValue = DependencyObject.SetValue.Template[int]

def OnLoad(sender, event):
    e = Ellipse()
    b = SolidColorBrush(Colors.Blue)
    black = SolidColorBrush(Colors.Black)   
    SetIntValue(e, Canvas.LeftProperty, 30)
    SetIntValue(e, Canvas.TopProperty, 30)
    SetIntValue(e, Canvas.ZIndexProperty, 2)   
    e.Height = 200
    e.Width = 200
    e.Stroke = black
    e.StrokeThickness = 10
    e.Fill = b                   
    Root.Children.Add(e)

1 komentarz:

maliboo pisze...

Root.Children.Add(e)

Smells like AS3;)