设为首页 收藏本站
查看: 1422|回复: 0

[经验分享] Python For Delphi---更好地协同

[复制链接]

尚未签到

发表于 2018-8-10 11:12:19 | 显示全部楼层 |阅读模式
  先上相关资源的下载吧:
  python4delphi:
  主页:
  http://code.google.com/p/python4delphi/
  下载:
  svn checkout http://python4delphi.googlecode.com/svn/trunk/ python4delphi-read-only
  现在已支持到XE2.
  必看(作者):
  http://www.atug.com/andypatterns/pythonDelphiTalk.htm
  下面要示范的就是在XE2下完成.其实源码检出后,里面有30多个示例,几乎涵盖了Python4Delphi的所有方面.好吧,我们下面做个简单的加法计算器,主要是演示二者之间的参数传递.
  当然,需要在Delphi中先安装上PythonForDelphi控件包,安装不麻烦,可参考上述资料的说明文档.
  在XE2中新建一个工程,然后在窗口中依次放上一个TPythonEngine,三个TPythonDelphiVar,TPythonDelphiVar的VarName分别设置为Num1,Num2,Result.再放上三个LabelEdit,分别命名为edtNum1,edtNum2,edtResult.
  上代码:
  

unit FfrmMain;  

  
interface
  

  
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, RzPanel,
  PythonEngine, PythonGUIInputOutput, RzButton;
  

  
type

  TfrmMain =>  memInput: TMemo;
  Splitter1: TSplitter;
  memOutput: TMemo;
  RzPanel1: TRzPanel;
  pyEngine: TPythonEngine;
  PythonGUIInputOutput1: TPythonGUIInputOutput;
  btnExcute: TRzBitBtn;
  PythonDelphiVar1: TPythonDelphiVar;
  PythonDelphiVar2: TPythonDelphiVar;
  edtNum1: TLabeledEdit;
  edtNum2: TLabeledEdit;
  edtResult: TLabeledEdit;
  PythonDelphiVar3: TPythonDelphiVar;
  procedure btnExcuteClick(Sender: TObject);
  procedure PythonDelphiVar1GetData(Sender: TObject; var Data: Variant);
  procedure PythonDelphiVar2GetData(Sender: TObject; var Data: Variant);
  procedure PythonDelphiVar3SetData(Sender: TObject; Data: Variant);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  

  
var
  frmMain: TfrmMain;
  

  
implementation
  

  
{$R *.dfm}
  

  
procedure TfrmMain.btnExcuteClick(Sender: TObject);
  
begin
  pyEngine.ExecStrings(memInput.Lines);
  
end;
  

  
procedure TfrmMain.PythonDelphiVar1GetData(Sender: TObject; var Data: Variant);
  
begin
  Data:=edtNum1.Text;
  
end;
  

  
procedure TfrmMain.PythonDelphiVar2GetData(Sender: TObject; var Data: Variant);
  
begin
  Data:=edtNum2.Text;
  
end;
  

  
procedure TfrmMain.PythonDelphiVar3SetData(Sender: TObject; Data: Variant);
  
begin
  edtResult.Text:=Data;
  
end;
  

  
end.
  

  上面窗体中还放了两个memo和一个TPythonGUIInputOutput,这些可以不用.
  然后在memInput中输入Python代码:
  

Result.Value=int(Num1.Value)+int(Num2.Value)  

  在执行按钮中填加代码:
  

pyEngine.ExecStrings(memInput.Lines);  

  当然,可以直接执行上面的Python代码.
  在edtNum1中输入一个数字,在edtNum2中输入一个数字,点击按钮,执行python脚本后就可以在edtResult中返回计算结果.
  注意:
  Result.Value=int(Num1.Value)+int(Num2.Value)
  TPythonDelphiVar传人的是字符类型,所以要转换为int后再相加,否则是字符串相加.
  这样,我们就完成了Delphi传递参数到Python,Python执行完毕后将结果再返回给Delphi的演示.好了,我们可以好好利用Python,将它很好地嵌入到Delphi中了.
  如果要传递更复杂的参数怎么办?我想,或许可以将要传递的参数JSON化,然后将JSON作为参数在二者之间相互传递,这样可以完成更复杂的功能.
  附上Python JSON文档:
  http://docs.python.org/2/library/json.html
  Delphi JSON之SuperObj:
  http://www.progdigy.com/?page_id=6
  http://code.google.com/p/superobject/
  Delphi通过PythonForDelphi变量来和Python交换数据可以,有没有别的办法了呢?有,可以像COM一样来调用Python模块的变量和函数,这看起来好像能更酷一些 :-)
  感谢samson,是他的一篇文章使我学习到了这个方法,并且很热心地给予了指教!
  废话少说,先上Python代码(hello.py,放到程序目录下):
  

strPython='Hello,This is a python string !'  
dicPython={'StringInfo':'Hello,This is a python string !'}
  
lstPython=list('Hello,This is a python string !')
  

  
def SayHello(s):
  return 'Hello,'+s
  

  上面是简单的示例,有变量和函数,我们看看在Delphi中怎样来调用.
  在Delphi中写下面的代码:
  

var  PyModule: variant;
  
....
  

  PyModule := Import('hello');
  //测试Python变量传递
  Memo1.Lines.Add(PyModule.strPython);
  Memo1.Lines.Add(PyModule.dicPython);
  Memo1.Lines.Add(PyModule.lstPython);
  Memo1.Lines.Add(PyModule.SayHello('Garfield'));
  

  执行后,在Delphi的Memo1中将看到下面的内容:
  

Hello,This is a python string !  
{'StringInfo': 'Hello,This is a python string !'}
  
['H', 'e', 'l', 'l', 'o', ',', 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'p', 'y', 't', 'h', 'o', 'n', ' ', 's', 't', 'r', 'i', 'n', 'g', ' ', '!']
  
Hello,Garfield

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549603-1-1.html 上篇帖子: python——twisted 下篇帖子: anaconda Python2安装包报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表