Gtk penceresindeki gömülü bir WebKit çerçevesini kullanarak arayüz için HTML + Javascript kullanarak geliştirebilirsiniz (bu Python'da yapmak en kolay olanıdır). En zor kısım, HTML / Javascript uygulamanızın sistemiyle iletişim kurmasıdır.
Bunu Javascript ile Python arasında mesaj ileterek yapabilirsiniz. Bununla birlikte, sistem mantığını Python işlevi olarak yazmak zorunda kalacaksınız, ancak bunu yapmak oldukça kolaydır.
Python ve Javascript arasındaki iletişimi gösteren basit bir örnek. Örnekte, HTML / Javascript, tıklandığında diziyi ["hello", "world"]
"hello world" dizgisine bağlayan ve tekrar Javascript'e gönderen Python'a bir dizi gönderen bir düğme görüntüler . Python kodu, dizinin bir gösterimini konsola yazdırır ve Javascript kodu, dizeyi görüntüleyen bir uyarı kutusu açar.
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()
sayfa.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>
Burada dikkat etmeniz gereken tek python kodu def output(data):
, dosyanın sonuna kadar anlaşılması kolay olan koddur .
Bunu çalıştırmak için emin olun python-webkit
ve python-gtk2
yüklendikten sonra dosyaları aynı klasöre kaydedin ve çalıştırın:
python example.py