桌面應用框架 OneRing
框架目標
OneRing是一個跨平臺的桌面應用框架。和Adobe AIR類似,它支持用html/js/css制作用戶界面,與之不同的是,它的應用為本地程序,可以直接訪問操作系統的數據。
架構
一個OneRing應用程序分為兩個部分:框架部分和應用部分。
框架部分
框架部分為通用框架,各應用都一樣。其提供各操作系統上的界面展現,為本地窗口內嵌一個WebKit瀏覽器,并提供一致的js接口讓應用和操作系統功能進行交互。
框架以運行時庫的形式提供。
框架以系統原生語言編寫,提供其他語言的綁定。
應用部分
應用部分為一個web server,負責應用邏輯,用html/css描述界面,用js提供用戶交互。
運行流程
- 應用啟動時,會加載框架的運行時庫,注冊應用url的訪問方法(如WSGI),并調用框架的loop函數。
- loop函數會訪問應用的 /init URL,得到一個json數據,描述初始應用窗口的相關參數,如位置、大小、窗口屬性、初始頁面url等。
- 框架根據該數據創建窗口,并讓該窗口內的瀏覽器訪問初始頁面url,渲染用戶界面,然后等待UI事件。
- 用戶在界面上操作時,可以通過超鏈接改變整個窗口內容,也可以使用AJAX技術更新窗口內部分內容。
- 應用可以讓瀏覽器調用ONERING名字空間下的js函數,和操作系統進行交互,該名字空間由url onering://onering/onering.js 加載。
- 應用通過 bind(event, function) 函數監聽窗口更改大小、移動等操作系統UI事件。
- 可以使用pub/sub機制主動推送消息給瀏覽器。
- 調用 ONERING.exit() 可以退出應用;所有窗口都關閉后也會退出應用。
Python應用示例
#!/usr/bin/env python
import json
import web
import onering
urls =(
'/init','init',
'/','index',
)
class init:
def GET(self):
web.header('Content-Type','application/json')
return json.dumps({'width':400,'height':300,'url':'/'})
class index:
def GET(self):
web.header('Content-Type','text/html')
return"""<html>
<head><script type="text/javascript" src="onering://onering/onering.js"></script></head>
<body>
<p>Hello, world!</p>
<button onclick="javascript:ONERING.exit()">Exit</button>
</body></html>"""
app = web.application(urls, globals())
if __name__ == '__main__':
onering.register_wsgi_app("demo", app.wsgifunc())
onering.loop("demo")
各組件之間的交互
一個OneRing應用中,存在三個需要互相通訊的組件:
- 操作系統 OS ,控制窗口行為(如最小化窗口),及操作系統相關界面元素(如系統通知圖標)
- 運行在WebKit內的javascript,控制界面內元素(如程序界面里的按鈕)
- WSGI應用,控制HTML/JS的生成邏輯,以及應用相關的后臺邏輯
js -> os
當js需要通知os對js所在窗口做某個行為(如最小化),通過調用 onering.js 中的get_current_window()返回值(為Window對象)的相應方法實現:
var current_window = ONERING.get_current_window();
current_window.minimize();
當js需要os執行整個應用層面的操作時(如結束應用),通過調用 onering.js 中的函數實現:
ONERING.exit();
當js需要os創建一個新窗口時,通過調用createWindow函數實現,并獲得新建窗體的句柄實例:
new_window = ONERING.createWindow('/a_dialog',400,300);
當js需要向另一個窗口做某個os行為時(如隱藏另一個窗口),通過調用窗體的句柄實例的方法實現:
new_window.hide();
os -> js
js可以通過bind機制,關注操作系統發生的時間(如窗口大小改變):
current_window.bind('resize',function(event){
if(event.width <300){
$('#sidebar').hide();
}
});
js -> app
js可以通過類AJAX調用,從app獲取數據。
ONERING.getJSON('/userdata.json',function(data){
...
});
app -> js
app希望向窗體內的js主動推送消息時,可以采用pub/sub機制。
首先js通知框架自己關注的事件:
current_window.subscribe("a_file_scanned",function(fileinfo){
...
});
然后當app希望發送消息時,調用onering框架提供的publish方法:
for fileinfo in scan_files():
onering.publish("a_file_scanned", fileinfo);
其中的fileinfo為可以轉化為JSON的python對象(即 json.dumps(fileinfo) 不會拋出異常)。
參考:https://code.google.com/p/onering-desktop/wiki/OneRing
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成