Anda dapat mengembangkan menggunakan HTML + Javascript untuk antarmuka dengan menggunakan bingkai WebKit yang tertanam di jendela Gtk (ini paling mudah dilakukan dengan Python). Bagian tersulit adalah berkomunikasi dengan sistem dari aplikasi HTML / Javascript Anda.
Anda dapat melakukan ini dengan mengirimkan pesan antara Javascript dan Python. Anda harus, bagaimanapun, harus menulis logika sistem sebagai fungsi Python tetapi ini cukup mudah dilakukan.
Berikut adalah contoh sederhana yang menunjukkan komunikasi antara Python dan Javascript. Dalam contoh tersebut, HTML / Javascript menampilkan tombol, yang ketika diklik mengirim array ["hello", "world"]
ke Python yang menggabungkan array ke string "hello world" dan mengirimkannya kembali ke Javascript. Kode Python mencetak representasi array ke konsol dan kode Javascript memunculkan kotak peringatan yang menampilkan string.
contoh.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>
Satu-satunya kode python yang benar-benar perlu Anda perhatikan di sini adalah kode dari def output(data):
hingga akhir file yang seharusnya cukup mudah dimengerti.
Untuk menjalankan ini pastikan python-webkit
dan python-gtk2
diinstal kemudian simpan file dalam folder yang sama dan jalankan:
python example.py