[二]Python通过ActiveX容器嵌入flash

16 篇文章 0 订阅
12 篇文章 0 订阅

Python代码

# -*- coding: utf-8 -*-
import wx
import os
from xml.dom import minidom
from wx.lib.flashwin import FlashWindow

class EIDataSerializer:
    __xmlData=None
    def __packNumber(self,p,x):
        p.appendChild(self.__xmlData.createElement('number')).appendChild(self.__xmlData.createTextNode(str(x)))
        return
    def __packString(self,p,x):
        p.appendChild(self.__xmlData.createElement('string')).appendChild(self.__xmlData.createTextNode(x))
        return
    def __packNone(self,p):
        p.appendChild(self.__xmlData.createElement('null'))
        return
    def __packBool(self,p,x):
        if x:
            p.appendChild(self.__xmlData.createElement('true'))
        else:
            p.appendChild(self.__xmlData.createElement('false'))
        return
    def __packDict(self,p,x):
        p=p.appendChild(self.__xmlData.createElement('object'))
        for k,v in x.items():
            n=p.appendChild(self.__xmlData.createElement('property'))
            n.setAttribute('id',str(k))
            self.__packData(n,v)
        return
    def __packList(self,p,x):
        p=p.appendChild(self.__xmlData.createElement('array'))
        i=0
        for v in x:
            n=p.appendChild(self.__xmlData.createElement('property'))
            n.setAttribute('id',str(i))
            self.__packData(n,v)
            i+=1
        return
    def __packData(self,p,x): ##将Python的类型打包成XML
        t=type(x)
        if t in (int,long,float):               
            self.__packNumber(p,x)
        elif t in (str,unicode):                
            self.__packString(p,x)
        elif x==None:                           
            self.__packNone(p)
        elif t==bool:       
            self.__packBool(p,x)
        elif t in (list,tuple):
            self.__packList(p,x)
        elif t==dict:
            self.__packDict(p,x)
        return
    def __unpackNumber(self,p):
        try:
            return int(p.firstChild.nodeValue)
        except ValueError:
            try:
                return float(p.firstChild.nodeValue)
            except ValueError:
                return None
    def __unpackString(self,p):
        return p.firstChild.nodeValue
    def __unpackTrue(self):
        return True
    def __unpackFalse(self):
        return False
    def __unpackNull(self):
        return None
    def __unpackUndefined(self):
        return None
    def __unpackObject(self,p):
        d={}
        for n in p.childNodes:
            d[n.getAttribute('id')]=self.__unpackData(n.firstChild)
        return d
    def __unpackArray(self,p):
        a=[]
        for n in p.childNodes:
            a.append(self.__unpackData(n.firstChild))
        return a
    def __unpackData(self,p): ##将Flash传过来的XML解析成Python类型数值
        t=p.nodeName
        if t=='number':
            return self.__unpackNumber(p)
        elif t=='string':
            return self.__unpackString(p)
        elif t=='true':
            return self.__unpackTrue()
        elif t=='false':
            return self.__unpackFalse()
        elif t=='null':
            return self.__unpackNull()
        elif t=='undefined':
            return self.__unpackUndefined()
        elif t=='object':
            return self.__unpackObject(p)
        elif t=='array':
            return self.__unpackArray(p)
    def serializeReturn(self,v):
        self.__xmlData=minidom.Document()
        p=self.__xmlData
        self.__packData(p,v)
        return self.__xmlData.toxml()
    def serializeCall(self,name,args):
        self.__xmlData=minidom.Document()
        p=self.__xmlData.appendChild(self.__xmlData.createElement('invoke'))
        p.setAttribute('name',name)
        p.setAttribute('returntype','xml')
        p=p.appendChild(self.__xmlData.createElement('arguments'))
        for v in args:
            self.__packData(p,v)
        s=self.__xmlData.documentElement.toxml()
        return s
    def deserializeReturn(self,s):
        self.__xmlData=minidom.parseString(s)
        p=self.__xmlData.documentElement
        return self.__unpackData(p)
    def deserializeCall(self,s):
        self.__xmlData=minidom.parseString(s)
        p=self.__xmlData.documentElement#invoke
        name=p.getAttribute('name')
        args=[]
        p=p.firstChild#arguments
        for n in p.childNodes:
            args.append(self.__unpackData(n))
        return (name,args)

class FlashFrame(wx.Frame):
    def __init__(self, parent, fid, title): 
        wx.Frame.__init__(self, parent, fid, title)  
        sort = -1
        self.rootPanel = wx.Panel(self, sort)
        self.flashWin  = FlashWindow(self.rootPanel)
        self.txtBox    = wx.TextCtrl(self.rootPanel, wx.NewId())
        self.btSend    = wx.Button(self.rootPanel, wx.NewId(), "Call Flash")
    
        self.flashSizer = wx.BoxSizer(wx.VERTICAL)
        self.flashSizer.Add(self.flashWin, proportion=1,   flag=wx.EXPAND)
        self.flashSizer.Add(self.txtBox,   proportion=0.3, flag=wx.EXPAND|wx.ALL, border=2)
        self.flashSizer.Add(self.btSend,   proportion=0.3, flag=wx.EXPAND|wx.ALL, border=2)
        self.rootPanel.SetSizer(self.flashSizer)
        self.rootPanel.SetAutoLayout(True)

        self.flashWin.AddEventSink(self)
        self.rootPanel.Bind(wx.EVT_BUTTON, self.sendToFlashHandler, self.btSend)
        self.flashWin.LoadMovie(0, os.getcwd() + os.path.sep + 'hello.swf')
        return

    def FlashCall(self, xmlStr):
        serializer = EIDataSerializer()
        xmlStr   = xmlStr.encode('utf-8')             ##从Flash控件消息接收的XML字符串
        print "FlashCall: \n" + xmlStr
        name, args       = serializer.deserializeCall(xmlStr) ##解析成Python函数名和参数
        print name
        print args
        print args[0]
        result = "Python返回: " + args[0]
        result = serializer.serializeReturn(result)                     ##返回值打包成XML  
        self.flashWin.ctrl.SetReturnValue(result)
    


    def sendToFlashHandler(self, btEvent):
        sendStr = self.txtBox.GetValue()
        flashFunctionName = "helloFlash"
        xmlStr = "<invoke name=\"" + flashFunctionName + "\" returntype=\"xml\">"
        xmlStr += "<arguments>"
        xmlStr += "<string>" + sendStr + "</string>"
        xmlStr += "</arguments>"
        xmlStr += "</invoke>"
        rValue = self.flashWin.ctrl.CallFunction(xmlStr)
        print "Flash返回: ", rValue


app = wx.PySimpleApp()
frame = FlashFrame(None, -1, "Python & Flash")
frame.Show(True)
app.MainLoop()


Flash代码

package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;
	import flash.text.TextField;
	import flash.text.TextFieldType;

	public class Hello extends Sprite {
		
		private var input:TextField;
		private var submit:Sprite;
		private var message:TextField;
		
		public function Hello() {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
		}
		
		private function onAddedToStage(event:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			createInput();
			createButton();
			createMessage();
			ExternalInterface.addCallback("helloFlash", helloFlash);
		}
		
		private function createInput():void {
			input = new TextField();
			input.type = TextFieldType.INPUT;
			input.width = 200;
			input.height = 30;
			input.border = true;
			input.text = "请输入传给Python方法的参数";
			addChild(input);
		}
		
		private function createButton():void {
			submit = new Sprite();
			submit.graphics.beginFill(0x888888);
			submit.graphics.drawRoundRect(0, 0, 60, 30, 5, 5);
			submit.graphics.endFill();
			addChild(submit);
			submit.x = input.x + input.width + 1;
			submit.addEventListener(MouseEvent.CLICK, onSubmitClick);
		}
		
		private function onSubmitClick(event:MouseEvent):void {
			if(input.text && !isSpaces(input.text)) {
				var result:* = ExternalInterface.call("helloPython", input.text);
				if(!result) {
					result = "null";	
				}
				result += "\n";
				message.appendText(result as String);
			}else {
				input.text = "请输入传给Python方法的参数";	
			}
		}
		
		public function helloFlash(data:String):String {
			return "Python input: " + data;	
		}
		
		private function isSpaces(str:String):Boolean {
			for (var i:int = 0; i < str.length; i++) {
				var char:String = str.charAt(i);
				if(char != " ") {
					return false;	
				}
			}
			return true;
		}
		
		private function createMessage():void {
			message = new TextField();
			message.width = input.width + submit.width + 1;
			message.height = 100;
			message.wordWrap = true;
			message.multiline = true;
			message.border = true;
			addChild(message);
			message.text = "";
			message.x = input.x;
			message.y = input.y + input.height + 5;
		}
	}
}

























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值