`

不可错过的MSDN TV —— IronPython: Python on the .NET Framework (下)

阅读更多

        在去年的Post中,介绍了Demo中有关WinFX的内容。那么今年呢,我们继续把这件做了一年的事情给做完。IronPython 1.0都赶在2005年的最后一天发布了,而这个系列的最后一篇Post竟然难产,成为2006年的新生儿,也真够FT的~~
        Demo 6  与C#之间的互协作:Demo中使用ImageView的Sample来自Windows SDK中WinFX SDK的部分,由于WinFX SDK并没有单独发布的,因此要把WinFX SDK安装上去还是得把整个Window SDK装上。而Windows SDK是以DVD Image的形式发布的,通常是需要刻录成DVD,或者使用解压缩工具打开的,MS也提供了一个很小巧的工具(在下载页面的Instruction部分有介绍):Virtual CD-ROM Control Panel for Windows XP帮助你创建一个虚拟DVD光驱,利用它可以轻松地打开下载的Image文件。在安装了Windows SDK之后,你可以在帮助文档中使用"ImageView Sample"作为关键字进行搜索,即可找到Demo中的ImageView这个Sample。为了能够在VS 2005正确地运行这个Sample,还得把WinFX Development Tools For VS 2005装上去。万事俱备之后,将这个Sample运行起来已经不成问题了。
        Demo 6.1  在C#中执行简单的IronPython代码:运行了原装正版的WinFX ImageView Sample之后,我们接下来就要根据Demo的演示,对这个Sample进行一些小改动,增加新的功能以体现IronPython与C#之间的协作性。首先是在default.xaml中增加一个新的Button并设置Click的属性,然后在default.xaml.cs中增加相应的事件处理函数:RunScript。代码分析如下:

1. PythonEngine engine = new PythonEngine();  创建一个PythonEngine实例,通过该实例的方法可以执行IronPython的代码;  
2. engine.SetVariable("win"this);  设置IronPython代码执行所需要的变量,这段代码实质就是对应:win = this。而this指的就是ImageViewExample的实例,而ImageViewExample则是继承于System.Windows.Window类;
3. engine.Execute("win.SetImage('c:/images/itrun.jpg')");  执行一行简单的IronPython代码:win.SetImage('c:/images/itrun.jpg')。


Demo用到了一个SetImage的方法,而这个方法在原始版本的ImageView Sample中是没有的,为了方便大家,将该方法的代码列示如下:

public void SetImage(string filename) {
    Uri selLoc 
= new Uri(filename);
    BitmapImage id 
= new BitmapImage(selLoc);
    FileInfo currFileInfo 
= new FileInfo(filename);
    currentImage.Source 
= id;

    
//Setup Info Text
    imageSize.Text = id.PixelWidth.ToString() + " x " + id.PixelHeight.ToString();
    imageFormat.Text 
= id.Format.ToString();
    fileSize.Text 
= ((currFileInfo.Length + 512/ 1024).ToString() + "k";
}

  
        好了,Demo 6的第一部分就完成了,是不是有点迷惑呢?我猜你的迷惑就在于Demo 6的title上:与C#之间的互相协作,或许你会觉得把以上内容称作C#与IronPython的协作就像是在糊弄人,因为这样的调用似乎没有什么意义,我还不如直接调用SetImage方法呢。嗯,嗯,别急,这个Demo还有第二部分哦。

        Demo 6.2 将IronPython代码从C#代码中分离出来:从Demo 6.1可以看到,IronPython代码直接写在了C#代码中。很明显,这种做法只能够执行一些简单的IronPython Script,如果复杂一些的话,恐怕就会令C#代码显得凌乱了。因此IronPython Engine提供了一个RunFile的方法,让你可以将IronPython Script从C#代码中独立出来,以.py的文件存在,并在运行期调用之。这个Demo使用了类OpenFileDialog,因此需要增加对System.Windows.Forms的引用。代码分析如下:

1using OpenFileDialog = System.Windows.Forms.OpenFileDialog;  不直接使用using System.Windows.Forms是为了防止类名冲突,因为System.Windows.Controls和System.Windows.Forms这两个Namespace都有ListBox类;           
2. engine.RunFile(ofd.FileName); 调用IronPython Engine提供的RunFile方法,其中ofd为OpenFileDialog的实例。


Demo中调用了sample.py的IronPython Script,该文件的内容如下:

import sys
sys.LoadAssemblyByName(
"WindowsBase")
sys.LoadAssemblyByName(
"PresentationCore")
sys.LoadAssemblyByName(
"PresentationFramework")

from System import *
from System.Windows.Controls import *
from System.Windows.Media.Animation import *
from System.Windows.Media import *
from System.Windows import *
from System.Windows.Shapes import *

text 
= TextBlock(Text='MSDN Rocks', FontSize=100, Foreground = Brushes.Black)
= DoubleAnimation(0.0, Duration(TimeSpan.FromSeconds(3)))
text.BeginAnimation(Shape.OpacityProperty, a)
Canvas.SetLeft(text, 
5)
Canvas.SetTop(text, 
15)  #以上两行有关Canvas的设置其实是无效的,因为XAML中并没有canvas的定义

win.Content.Children[
1].Children.Add(text)


        启动这个Demo之后,不要选择图片,而是直接点击Run Script按钮,选择sample.py文件,你将会看到MSDN Rocks渐变文字。如果你希望自己的程序能够与视频中的效果一样:文字浮现在图片之上,那么你就得修改default.xaml文件了——把包含着Image Control的DockPanel改为Canvas即可。这个Demo还没有结束,如果就这么结束了,恐怕你会跟我没完:Demo 6.1留下的问题还没有解决呢。好,我们接下来改动一下sample.py的代码,把TextBlock中的Brushes.Black改为Brushes.Red,然后再次点接Run Script按钮,选择sample.py文件。噢,黑色的MSDN Rocks变成了红色。而在这个过程中,我们不需要进行烦琐的关闭程序、编译和重新启动的动作。这样的好处是显而易见的,我们可以仍然使用C#完成应用程序的核心部分,而将时常需要改动的部分以IronPython代码的形式存储,这样我们就能够在最短的时间内实现不同功能的切换了。Demo 6就讲述到这里了,有兴趣的朋友可以从IronPython附带的Tutorial中获得更多的信息。

        Demo 7 调试IronPython程序:在这个Demo中,Jim向我们展示了如何利用VS 2005对IronPython程序进行调试。可惜的是,我并没有完成视频中的示范演示,因为VS的Debugger并不能定位到具体的.py文件,我还在找问题的原因。尽管VS Debugger并不知道IronPython的语法,但是聪明的它却可以定位到.py文件中产生错误的地方,你更可以为IronPython代码设置断点,临时修改变量值等等。IronPython就是这样与VS Debugger无缝地联系在一起,是不是很神奇呢?其实个中的原因并不难理解:IronPython代码最终是会转换为IL代码,由.NET Framework运行的,而VS Debugger自然可以认得IL了。虽然这个Demo很perfect,让人振奋,但是仍然有一个小问题:说明错误原因的Popup窗口并没有如我所愿地显示出来。了解个中原因的朋友,还请多多指教了。

        Demo 8 调用COM组件:这个Demo比较可爱,通过IronPython与COM组件的协作使用MS Agent的特性。首先需要使用.NET工具中的tlbimp命令将COM组件转换成.NET程序可调用的Assembly:   

D:\IronPython\Tutorial>tlbimp c:\WINDOWS\msagent\agentsvr.exe


该命令执行完毕之后就在当前目录生成了一个AgentServerObjects.dll。接着,在当前目录下创建一个merlin.py文件,具体内容如下:

import sys
sys.LoadAssemblyFromFile(
"AgentServerObjects.dll")
from AgentServerObjects import *
= AgentServerClass()
id, rest 
= a.Load("merlin.acs")
ch 
= a.GetCharacter(id)

ch.SetSize(
128,128)
ch.MoveTo(0, 0, 0)
ch.Show(0)
ch.MoveTo(
6001002000)
ch.Play(
"Announce")
ch.MoveTo(
3001501000)
ch.Play(
"Think")
ch.Play(
"Search")
ch.Play(
"Congratulate")
ch.Hide(0)


最后,通过Demo 6.2中的ImageView程序,执行merlin.py。一个很可爱的卡通人物——Merlin就会出现在你面前了,他会做不少很Q的动作,呵呵~~~ 在这里需要说明一点的是:如果你打算在Interactive Mode下面直接执行以上代码,你会碰到如下的错误:

Traceback (most recent call last): 
at 
<shell> 
System.InvalidCastException: Creating an instance of the COM component with CLSID {D45FD2FC
-5C6E-11D1-9EC1-00C04FD7081F} from the IClassFactory failed due to the following error: 80004002.

这是由线程的问题引起的,解决的办法就是修改IronPythonConsole目录下PythonCommandLine.cs,在源代码的Main函数前增加[STAThread],然后重新构建这个Solution即可。

        新年的开篇Post,也终于基本完成任务了,但愿遗留下来的问题不会拖得太久。最后祝各位新年快乐,身体健康,心想事成!

分享到:
评论

相关推荐

    23个.NET开源项目

    最后,文章强调了MS-PL许可的特点——相比GPL许可,MS-PL允许开发者在不公开源代码的情况下自由使用和修改软件,这一特性吸引了大量开发者加入.NET开源社区,共同推动.NET技术的进步。同时,文章也提到了Mono项目的...

    MSDN+C#+4.0编程指南

    - **动态类型**:C# 4.0引入了`dynamic`关键字,允许在运行时进行类型绑定,极大地简化了与非.NET库如JavaScript或IronPython的交互。 - **多目标参数**:C# 4.0支持可选参数和命名参数,使函数调用更加灵活,减少...

    基于Retinex模型与多尺度融合的低光照图像增强算法及其应用

    内容概要:本文介绍了一种基于Retinex模型和多尺度融合的低光照图像增强算法。首先,通过对原图像进行光照图分解并利用Retinex模型进行估计,再经过伽马矫正获得亮度均衡的图像。接着,为补偿伽马矫正当中的过曝细节丢失,进行了锐化处理以提升图像细节。最后,在多尺度融合金字塔模型下,根据不同输入图像的权重进行融合,从而得到最终的增强图像。文中还详细介绍了五个非参考图像质量评价指标(BRISQUE,CEIQ,ENIQA,NIQE,PIQE),用以评估算法的效果。 适合人群:从事计算机视觉、图像处理领域的研究人员和技术人员。 使用场景及目标:适用于需要在低光照条件下获取高质量图像的各种应用场景,如安防监控、自动驾驶、医疗影像等领域。目的是提高图像的亮度、对比度和细节,确保后续图像处理任务的有效性和准确性。 其他说明:该算法不仅提高了低光照环境拍摄照片的质量,也为其他计算机视觉应用提供了更好的图像素材,具有重要的社会和经济价值。

    scratch少儿编程逻辑思维游戏源码-奔跑吧!忍者.zip

    scratch少儿编程逻辑思维游戏源码-奔跑吧!忍者.zip

    基于人工蜂群算法的智能路径规划系统:全局搜索、鲁棒性强、灵活多用的路径规划解决方案

    内容概要:本文详细介绍了基于人工蜂群算法的路径规划系统。该算法模拟蜜蜂觅食行为,通过多个个体的并行搜索,实现了全局搜索能力强、鲁棒性和适应性强、适用范围广、算法设计灵活以及具有分布式计算能力等特点。文中还提供了简化的代码片段,展示了如何实现地图创建、保存和起始地点更改等功能,进一步解释了算法的具体实现方法。 适合人群:对路径规划算法感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于复杂环境下的单目标或多目标路径规划问题,旨在帮助研究人员和开发者更好地理解和应用人工蜂群算法,提升路径规划系统的性能和效率。 其他说明:该算法不仅在理论上具有较高的研究价值,还在实际应用中展现了广泛的潜力,特别是在智能交通、机器人导航等领域。

    基于鲸鱼算法优化LSSVM回归模型:提高预测准确率与全局优化能力

    内容概要:本文介绍了如何使用鲸鱼算法优化最小二乘支持向量机(LSSVM)的回归预测模型。通过模拟鲸鱼群体的行为,优化LSSVM中的惩罚参数和核惩罚参数,提高了预测的准确性和可靠性。鲸鱼算法具有广泛的适用性、强大的全局优化能力和高效的计算特点,使其成为解决各类回归预测问题的有效工具。文中还提供了具体的Python代码实现,展示了从基本LSSVM预测到参数优化的具体步骤,并通过实验数据验证了优化后的模型在训练时间和预测精度上的显著优势。 适合人群:对机器学习、优化算法感兴趣的开发者和技术研究人员,尤其是希望深入了解和支持向量机优化的人群。 使用场景及目标:适用于需要提高回归预测准确性的应用场景,如金融预测、气象预报等领域。目标是通过优化模型参数,获得更高的预测精度和更快的计算速度。 其他说明:鲸鱼算法不仅在理论上具有优越性,在实际应用中也能显著提升模型性能。建议根据具体的数据规模调整算法参数,以达到最佳效果。

    scratch少儿编程逻辑思维游戏源码-超级猫.zip

    scratch少儿编程逻辑思维游戏源码-超级猫.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥世界 多人游戏.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥世界 多人游戏.zip

    scratch少儿编程逻辑思维游戏源码-丛林探险跑酷.zip

    scratch少儿编程逻辑思维游戏源码-丛林探险跑酷.zip

    【java】智能自助式停车场管理系统后台web管理服务器javaweb项目.zip

    【java】智能自助式停车场管理系统后台web管理服务器javaweb项目

    二阶系统PID控制器设计与仿真的灵活性及性能优化研究

    内容概要:本文详细介绍了二阶系统的PID控制器设计与仿真方法,展示了如何通过MATLAB进行系统建模和控制器参数调整。首先构建了一个典型的二阶系统作为例子,通过设置不同的PID参数(比例P、积分I、微分D),演示了如何优化系统的阶跃响应特性。文中还讨论了不同参数对系统稳定性的影响,以及如何应对非线性环节带来的挑战。此外,作者强调了PID控制器参数调整的重要性,并提供了几种实用技巧,如使用MATLAB内置工具pidTuner进行参数整定,以及尝试更换不同的被控对象来测试控制器的适应性和鲁棒性。 适合人群:自动化工程专业学生、从事工业控制系统设计的技术人员、对PID控制感兴趣的科研工作者。 使用场景及目标:① 学习如何利用MATLAB搭建二阶系统并设计PID控制器;② 掌握PID参数调整的基本方法及其对系统性能的影响;③ 提升解决实际工业控制问题的能力,特别是在面对复杂动态环境时。 阅读建议:读者可以通过跟随文中的步骤,在自己的环境中重现实验结果,从而加深对PID控制理论的理解。同时,鼓励读者尝试修改系统参数或引入新的干扰因素,进一步探索PID控制器的应用边界。

    少儿编程scratch项目源代码文件案例素材-扫雷.zip

    少儿编程scratch项目源代码文件案例素材-扫雷.zip

    少儿编程scratch项目源代码文件案例素材-圣诞老人VS机器人.zip

    少儿编程scratch项目源代码文件案例素材-圣诞老人VS机器人.zip

    基于AT89C51单片机交通灯课程设计

    【基于AT89C51单片机的交通灯系统】是电子工程领域中的一个经典实践项目,尤其适合初学者进行单片机编程和硬件控制的学习。AT89C51是一款广泛应用的8位微处理器,由美国Atmel公司生产,具有4KB的可编程Flash存储器,可以执行各种控制任务,包括交通灯系统的控制。 交通灯控制系统是城市交通管理的重要组成部分,通过红绿黄三色灯的变化来指示行人和车辆何时通行。在本项目中,交通灯系统采用AT89C51单片机作为核心控制器,通过编程实现红绿黄灯的定时切换,确保交通流畅且安全。 DSN(Design Suite Notation)文件,如`C51交通灯.DSN`,通常是在电路设计软件,如Keil uVision或Proteus中创建的工程文件。这种文件包含了整个项目的配置信息,包括源代码、元器件库、仿真设置等,使得开发者可以在虚拟环境中对交通灯系统进行仿真测试。Proteus是一款强大的电子电路仿真软件,可以直观地模拟硬件电路的行为,无需物理硬件即可验证设计的正确性。 数码管(7段显示器)是显示倒计时的关键部件。在这个项目中,数码管用于显示每个灯组的剩余时间,增强用户交互体验,使驾驶员和行人能够清晰了解何时转换灯色。AT89C51通过串行或并行接口与数码管连接,并通过特定的驱动程序代码控制数码管的显示内容。 编程方面,AT89C51使用C51语言编写,这是一种为8051系列单片机定制的C语言变体。代码中包含的详细注释对于初学者理解程序逻辑至关重要,通过注释可以学习如何设置定时器、中断服务子程序以及I/O端口操作,这些都是单片机编程的基础知识。 交通灯的控制通常基于定时器中断,例如,可以设置一个定时器在特定周期后触发中断,然后在中断服务程序中改变灯的状态。此外,为了实现数码管显示,可能需要用到移位寄存器和译码器等外围设备,这些都需要在代码中进行编程控制。 这个项目涵

    基于MATLAB的改进带记忆模拟退火算法求解TSP问题(多普勒型降温曲线)

    内容概要:本文介绍了一种基于MATLAB的改进带记忆模拟退火算法用于求解旅行商问题(TSP)。该算法引入了多普勒型降温曲线和记忆功能,使得算法在前期进行全局搜索而在后期进行精细调整。文中详细展示了算法的核心代码片段,如多普勒型降温曲线的实现和记忆功能的具体实现方式。此外,作者提供了对多个经典数据集(如att48、中国31/64/144城市数据)的测试结果,证明了该算法的有效性和优越性。同时,还给出了自定义数据集的测试方法和路径可视化的代码。 适合人群:对优化算法感兴趣的研究人员和技术爱好者,尤其是那些希望深入了解模拟退火算法及其应用的人群。 使用场景及目标:适用于需要解决复杂组合优化问题的场景,特别是涉及路径规划、物流配送等领域。目标是提供一种高效、稳定的解决方案,帮助用户快速获得高质量的解。 其他说明:本文不仅提供了完整的代码实现,还包括详细的解释和测试实例,便于读者理解和实践。对于想要进一步探索或修改算法的人来说,这是一个很好的起点。

    MMC-HVDC电能质量调节系统及其背靠背模块化多电平换流器在电网与粒子加速器中的应用

    内容概要:本文详细介绍了MMC-HVDC电能质量调节系统及其背靠背模块化多电平换流器(MMC)的工作原理和技术优势。MMC-HVDC系统主要用于保护敏感电网免受瞬态电压骤降的影响,通过内部能量存储和整流器控制线路电流,确保电网的稳定性。此外,该系统还具备无功功率补偿、低谐波失真和高冗余性的特点。文中特别提到MMC-HVDC在粒子加速器领域的应用和发展前景,强调了其在复杂环境中的适应性和可靠性。 适合人群:从事电力系统工程、电能质量管理、粒子加速器设计的研究人员和技术人员。 使用场景及目标:适用于需要解决瞬态电压骤降问题的电力系统,特别是在粒子加速器等对电能质量有较高要求的场合。目标是提高电网的稳定性和效率,减少设备损坏和系统不稳定性。 其他说明:文章还讨论了MMC-HVDC的设计和开发过程,包括模块化结构设计、能量存储优化和控制算法改进等方面的内容。

    少儿编程scratch项目源代码文件案例素材-侵略者.zip

    少儿编程scratch项目源代码文件案例素材-侵略者.zip

    scratch少儿编程逻辑思维游戏源码-暴徒危机.zip

    scratch少儿编程逻辑思维游戏源码-暴徒危机.zip

    少儿编程scratch项目源代码文件案例素材-收缩剑.zip

    少儿编程scratch项目源代码文件案例素材-收缩剑.zip

    少儿编程scratch项目源代码文件案例素材-忍者传奇.zip

    少儿编程scratch项目源代码文件案例素材-忍者传奇.zip

Global site tag (gtag.js) - Google Analytics