Puoi sviluppare usando HTML + Javascript per l'interfaccia usando un frame WebKit incorporato in una finestra Gtk (questo è più facile da fare in Python). La parte più difficile è comunicare con il sistema dall'applicazione HTML / Javascript.
Puoi farlo passando messaggi tra Javascript e Python. Dovrai, comunque, scrivere la logica di sistema come funziona Python ma questo è abbastanza facile da fare.
Ecco un semplice esempio che mostra la comunicazione tra Python e Javascript. Nell'esempio, HTML / Javascript visualizza un pulsante che, quando viene cliccato, invia un array ["hello", "world"]
a Python che unisce l'array in una stringa "ciao mondo" e lo restituisce a Javascript. Il codice Python stampa una rappresentazione dell'array sulla console e il codice Javascript apre una finestra di avviso che visualizza la stringa.
example.py
import gtk
import webkit
import json
import os
JAVASCRIPT = """
var _callbacks = {};
function trigger (message, data) {
if (typeof(_callbacks[message]) !== "undefined") {
var i = 0;
while (i < _callbacks[message].length) {
_callbacks[message][i](data);
i += 1;
}
}
}
function send (message, data) {
document.title = ":";
document.title = message + ":" + JSON.stringify(data);
}
function listen (message, callback) {
if (typeof(_callbacks[message]) === "undefined") {
_callbacks[message] = [callback];
} else {
_callbacks[message].push(callback);
}
}
"""
class HTMLFrame(gtk.ScrolledWindow):
def __init__(self):
super(HTMLFrame, self).__init__()
self._callbacks = {}
self.show()
self.webview = webkit.WebView()
self.webview.show()
self.add(self.webview)
self.webview.connect('title-changed', self.on_title_changed)
def open_url(self, url):
self.webview.open(url);
self.webview.execute_script(JAVASCRIPT)
def open_path(self, path):
self.open_url("file://" + os.path.abspath(path))
def send(self, message, data):
self.webview.execute_script(
"trigger(%s, %s);" % (
json.dumps(message),
json.dumps(data)
)
)
def listen(self, message, callback):
if self._callbacks.has_key(message):
self._callbacks[message].append(callback)
else:
self._callbacks[message] = [callback]
def trigger(self, message, data, *a):
if self._callbacks.has_key(message):
for callback in self._callbacks[message]:
callback(data)
def on_title_changed(self, w, f, title):
t = title.split(":")
message = t[0]
if not message == "":
data = json.loads(":".join(t[1:]))
self.trigger(message, data)
def output(data):
print(repr(data))
if __name__ == "__main__":
window = gtk.Window()
window.resize(800, 600)
window.set_title("Python Gtk + WebKit App")
frame = HTMLFrame()
frame.open_path("page.html")
def reply(data):
frame.send("alert", " ".join(data))
frame.listen("button-clicked", output)
frame.listen("button-clicked", reply)
window.add(frame)
window.show_all()
window.connect("destroy", gtk.main_quit)
gtk.main()
page.html
<html>
<body>
<input type="button" value="button" id="button" />
<script>
document.getElementById("button").onclick = function () {
send("button-clicked", ["hello", "world"]);
};
listen("alert", function (data) {alert(data);});
</script>
</body>
</html>
L'unico codice Python a cui devi davvero prestare attenzione qui è il codice dalla def output(data):
fine del file che dovrebbe essere abbastanza facile da capire.
Per eseguire questo assicurarsi python-webkit
e python-gtk2
sono installati quindi salvare i file nella stessa cartella ed eseguire:
python example.py