myBlog

IronPython, Silverlight, WPF, XAML, HTML5, ...

IronPythonで、自由にドラッグできる、時計を作りました! 《 Drag clock 》

2011-07-09 14:07:48 | Animation
Dynamic Sliverlight サンプルの clock を WPF-IronPythonに変換しました。
下記のBlogを参考にして、Drag可能な、時計にしました。
Blog: jimmy.thinking ⇒ Dragging elements in Silverlight with DLRConsole
http://blog.jimmy.schementi.com/2008/08/dragging-elements-in-silverlight-with.html

MSDN Blogs ⇒ 荒井省三のBlog ⇒ DLR Console を使って時計をドラッグするサンプル
http://blogs.msdn.com/b/shozoa/archive/2008/09/03/dragging-clock-on-dlr-console.aspx

clock XAML⇒clock.xaml ⇒ アナログ時計

Clock

#
# clock.py
# ipy.exe clock.py
#
import clr
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReference('WindowsBase')
from System import Object
from System.Windows.Markup import XamlReader
from System.Windows import Window, Application
from System.Windows.Controls import Canvas
from System.Windows.Media import Brushes
from datetime import datetime

def LoadXamlNet(strUrl):
    import System
    request = System.Net.WebRequest.Create(strUrl)
    response = request.GetResponse()
    dataStream = response.GetResponseStream()
    try:
        element = XamlReader.Load(dataStream)
    finally:
        dataStream.Close()
        response.Close()
    return element

class Clock(Object):
    def __init__(self):
        self.scene = LoadXamlNet("http://softgarden.lovepop.jp/myBlog/xaml/clock.xaml")
        self.start()
    def _fromAngle(self, time, divisor = 5, offset = 0):
        return ((time / (12.0 * divisor)) * 360) + offset + 180
    def _toAngle(self, time):
        return self._fromAngle(time) + 360
    def start(self):
        d = datetime.now()
        #self.scene.FindName('hourAnimation').From = self._fromAngle(d.hour, 1, d.minute/2)
        #self.scene.FindName('hourAnimation').To = self._toAngle(d.hour)
        from_h = self._fromAngle(d.hour, 1, d.minute/2)
        to_h = from_h + 360.0
        self.scene.FindName('hourAnimation').From = from_h
        self.scene.FindName('hourAnimation').To = to_h
        self.scene.FindName('minuteAnimation').From = self._fromAngle(d.minute)
        self.scene.FindName('minuteAnimation').To = self._toAngle(d.minute)
        self.scene.FindName('secondAnimation').From = self._fromAngle(d.second)
        self.scene.FindName('secondAnimation').To = self._toAngle(d.second)

class Drag(object):
    def __init__(self, root, obj):
        self.click = None
        self.obj = obj
        self.root = root
    def OnMouseLeftButtonDown(self, sender, e):
        self.click = e.GetPosition(self.root)
        self.sx = Canvas.GetLeft(self.obj)
        self.sy = Canvas.GetTop(self.obj)
        if (self.sx.IsNaN(self.sx)): self.sx = 0.0
        if (self.sy.IsNaN(self.sy)): self.sy = 0.0
        self.obj.CaptureMouse()
    def OnMouseLeftButtonUp(self, sender, e):
        if(self.click != None):
            self.obj.ReleaseMouseCapture()
            self.click = None
    def OnMouseMove(self, sender, e):
        if(self.click != None):
            mouse_pos = e.GetPosition(self.root)
            Canvas.SetLeft(self.obj, (self.sx + mouse_pos.X - self.click.X))
            Canvas.SetTop(self.obj, (self.sy + mouse_pos.Y - self.click.Y))
    def enable(self):
         self.obj.MouseLeftButtonDown += self.OnMouseLeftButtonDown
         self.obj.MouseLeftButtonUp += self.OnMouseLeftButtonUp
         self.obj.MouseMove += self.OnMouseMove
    def disable(self):
         self.obj.MouseLeftButtonDown -= self.OnMouseLeftButtonDown
         self.obj.MouseLeftButtonUp -= self.OnMouseLeftButtonUp
         self.obj.MouseMove -= self.OnMouseMove

class ExWindow(Window):
    def __init__(self):
        self.Title = "Dynamic Languages Rock!"
        self.Width = 640
        self.Height = 480
        self.Content = canvas = Canvas(Background = Brushes.LightGray)
        self.clock = Clock().scene
        canvas.Children.Add (self.clock)
        #self.drag = Drag(root=canvas, obj=self.clock.FindName('parentCanvas'))
        self.drag = Drag(root=canvas, obj=self.clock)
        self.drag.enable()

if __name__ == "__main__":
    win = ExWindow()
    Application().Run(win)

IronPythonの世界 (Windows Script Programming)
荒井 省三
ソフトバンク クリエイティブ
エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
Pythonスタートブック
辻 真吾
技術評論社

最新の画像もっと見る

コメントを投稿