OneRing是一個支持用html/js/css製作用戶界面跨平台的桌面套用框架。
基本介紹
- 外文名:OneRing
- 類型:桌面套用框架
概述,架構,框架部分,套用部分,運行流程,Python套用示例,各組件之間的互動,
概述
和Adobe AIR類似,它支持用html/js/css製作用戶界面,與之不同的是,它的套用為本地程式,可以直接訪問作業系統的數據。
授權協定: LGPL
開發語言: Python
作業系統: 跨平台
架構
一個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
importjson
importweb
importonering
urls =(
'/init','init',
'/','index',
)
classinit:
defGET(self):
web.header('Content-Type','application/json')
returnjson.dumps({'width':400,'height':300,'url':'/'})
classindex:
defGET(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對象)的相應方法實現:
varcurrent_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 -> jsjs可以通過bind機制,關注作業系統發生的時間(如視窗大小改變):
current_window.bind('resize',function(event){
if(event.width <300){
$('#sidebar').hide();
}
});js -> appjs可以通過類AJAX調用,從app獲取數據。
ONERING.getJSON('/userdata.json',function(data){
...
});app -> jsapp希望向窗體內的js主動推送訊息時,可以採用pub/sub機制。
首先js通知框架自己關注的事件:
current_window.subscribe("a_file_scanned",function(fileinfo){
...
});然後當app希望傳送訊息時,調用onering框架提供的publish方法:
forfileinfo inscan_files():
onering.publish("a_file_scanned",fileinfo);其中的fileinfo為可以轉化為JSON的python對象(即 json.dumps(fileinfo) 不會拋出異常)。