Możesz rozwijać przy użyciu HTML + JavaScript dla interfejsu, używając osadzonej ramki WebKit w oknie Gtk (najłatwiej to zrobić w Pythonie). Najtrudniejsza część to komunikacja z systemem z aplikacji HTML / JavaScript.
Możesz to zrobić, przesyłając wiadomości między Javascriptem a Pythonem. Będziesz jednak musiał napisać logikę systemową jako funkcje Pythona, ale jest to dość łatwe do zrobienia.
Oto prosty przykład pokazujący komunikację między Pythonem a Javascriptem. W tym przykładzie HTML / JavaScript wyświetla przycisk, który po kliknięciu wysyła tablicę ["hello", "world"]
do Pythona, który łączy tablicę w ciąg „hello world” i odsyła ją z powrotem do Javascript. Kod Python drukuje reprezentację tablicy w konsoli, a kod JavaScript wyskakuje z ostrzeżeniem wyświetlającym ciąg.
przyklad.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>
Jedynym kodem w Pythonie, na który naprawdę należy zwrócić uwagę, jest kod od def output(data):
końca pliku, który powinien być dość łatwy do zrozumienia.
Aby uruchomić to upewnij się, python-webkit
a python-gtk2
zainstalowane są następnie zapisać pliki w tym samym folderze i uruchomić:
python example.py