This commit is contained in:
yumoqing 2021-01-23 15:55:38 +08:00
parent b87cd5af45
commit 13fdea6429
2 changed files with 44 additions and 22 deletions

View File

@ -298,7 +298,7 @@ class Blocks(EventDispatcher):
raise Exception(desc) raise Exception(desc)
widgetClass = desc['widgettype'] widgetClass = desc['widgettype']
opts = desc.get('options',{}).copy() opts = self.valueExpr(desc.get('options',{}).copy())
widget = None widget = None
try: try:
klass = wrap_ready(widgetClass) klass = wrap_ready(widgetClass)
@ -329,26 +329,23 @@ class Blocks(EventDispatcher):
continue continue
setattr(widget,k,w) setattr(widget,k,w)
continue continue
setattr(widget,k,v) setattr(widget,k,self.valueExpr(v,\
localnamespace={'self':widget}))
def build_rest(self, widget,desc,t=None): def build_rest(self, widget,desc,t=None):
self.subwidget_total = len(desc.get('subwidgets',[])) self.subwidget_total = len(desc.get('subwidgets',[]))
self.subwidgets = [ None for i in range(self.subwidget_total)] self.subwidgets = [ None for i in range(self.subwidget_total)]
pos = 0 pos = 0
for pos,sw in enumerate(desc.get('subwidgets',[])): for pos,sw in enumerate(desc.get('subwidgets',[])):
params={
'desc':desc,
'widget':widget,
'pos':pos
}
b = Blocks() b = Blocks()
kw = sw.copy() kw = sw.copy()
w = b.widgetBuild(kw) w = b.widgetBuild(kw)
widget.add_widget(w) widget.add_widget(w)
for b in desc.get('binds',[]): for b in desc.get('binds',[]):
kw = b.copy() kw = self.valueExpr(b.copy(), \
self.buildBind(widget,b) localnamespace={'self':widget})
self.buildBind(widget,kw)
def buildBind(self,widget,desc): def buildBind(self,widget,desc):
wid = desc.get('wid','self') wid = desc.get('wid','self')
@ -545,7 +542,7 @@ class Blocks(EventDispatcher):
desc,type(desc)) desc,type(desc))
return None return None
desc = self.valueExpr(desc) # desc = self.valueExpr(desc)
widget = self.w_build(desc) widget = self.w_build(desc)
self.dispatch('on_built',widget) self.dispatch('on_built',widget)
if hasattr(widget,'ready'): if hasattr(widget,'ready'):

View File

@ -5,33 +5,58 @@ from oscpy.server import OSCThreadServer
from oscpy.client import OSCClient from oscpy.client import OSCClient
class OSCServer(EventDispatcher): class OSCServer(EventDispatcher):
def __init__(self,addr='0.0.0.0', port=60405,apis=[]): def __init__(self,addr='0.0.0.0',
port=60405,
apis=[]):
self.port = port self.port = port
self.addr = addr self.addr = addr
self.clients = []
self.osc_server = OSCThreadServer() self.osc_server = OSCThreadServer()
self.osc_server.listen(self.addr,port=self.port,default=True) self.osc_server.listen(self.addr,port=self.port,default=True)
EventDispatcher.__init__(self) EventDispatcher.__init__(self)
apis.append('broadcast')
for api in apis: for api in apis:
self.register_event_type(api) event_name = 'on_%s' % api
f = partial(self.handle, api) f = partial(self.handle, api)
setattr(self, api, f) setattr(self, event_name, f)
self.register_event_type(event_name)
api_f = partial(self.apihandle,api) api_f = partial(self.apihandle,api)
bstr = '/%s' % api bstr = '/%s' % api
bstr.encode('utf-8') bstr.encode('utf-8')
self.osc_server.bind(bstr, api_f) self.osc_server.bind(bstr, api_f)
def info(self):
return {
"address":self.osc_server.getaddress()
}
def __del__(self):
self.osc_server.stop_all()
self.osc_server.terminate_server()
self.osc_server.join_server()
def handle(self,api,o,*args): def handle(self,api,o,*args):
print(api, *args) print(api, *args)
def apihandle(self, api, *args): def apihandle(self, api, *args):
self.dispatch(api,*args) data = json.loads(args[0])
sock, ip_address, response_port = self.osc_server.get_sender()
self.dispatch(api,
{'address':address,
'data':data
})
if api == 'broadcast':
return
if not address in self.clients:
self.clients.append([ip_address, response_port])
def sendMessage(self,api='', addr=None, port=None, *args): def send_message(self,api, data, addr, port):
try: data = json.dumps(data)
bstr = '/%s' % api bstr = '/%s' % api
bstr = bstr.encode('utf-8') bstr = bstr.encode('utf-8')
client = OSCClient(addr, port) self.osc_server.send_message(b'/broadcast', [data], addr, port)
client.sendMessage(bstr, args)
except: def broadcast(self, data):
print('sendMessage error:',api, addr,port,args) for address in self.clients:
self.osc_server.send_message('broadcast', data, *address)