Vous pouvez développer en utilisant HTML + Javascript pour l'interface en utilisant un cadre WebKit intégré dans une fenêtre Gtk (c'est le plus simple à faire en Python). La partie la plus difficile est de communiquer avec le système depuis votre application HTML/Javascript.
Vous pouvez le faire en envoyant des messages entre Javascript et Python. Vous devrez cependant écrire la logique du système en tant que fonctions Python mais c'est assez facile à faire.
Voici un exemple simple montrant la communication entre Python et Javascript. Dans l'exemple, le HTML/Javascript affiche un bouton qui, lorsqu'il est cliqué, envoie un tableau ["hello", "world"]
à Python qui joint le tableau en une chaîne "hello world" et l'envoie de nouveau à Javascript. Le code Python affiche une représentation du tableau dans la console et le code Javascript affiche une boîte d'alerte avec la chaîne.
exemple.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("Application Python Gtk + WebKit")
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
document.getElementById("button").onclick = function () {
send("button-clicked", ["hello", "world"]);
};
listen("alert", function (data) {alert(data);});
Le seul code Python sur lequel vous devez vraiment vous concentrer ici est le code de def output(data):
jusqu'à la fin du fichier, ce qui devrait être assez facile à comprendre.
Pour exécuter ceci, assurez-vous que python-webkit
et python-gtk2
sont installés, puis enregistrez les fichiers dans le même dossier et exécutez :
python exemple.py