Ви можете розвиватись за допомогою HTML + Javascript для інтерфейсу, використовуючи вбудований кадр WebKit у вікні Gtk (це найпростіше зробити в Python). Найважче - це спілкування з системою з вашого додатку HTML / Javascript.
Це можна зробити, передаючи повідомлення між Javascript та Python. Однак вам доведеться записати системну логіку як функції Python, але це зробити досить просто.
Ось простий приклад показує зв'язок між Python та Javascript. У прикладі HTML / Javascript відображає кнопку, яка при натисканні на неї надсилає масив ["hello", "world"]
Python, який приєднує масив до рядка "привіт світ" і повертає його назад у Javascript. Код Python друкує представлення масиву на консолі, і в коді Javascript з'являється вікно попередження, яке відображає рядок.
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>
Єдиний код python, на який вам дійсно потрібно звернути увагу, - це код з def output(data):
кінця файлу, який повинен бути досить зрозумілим.
Для запуску цього переконайтеся , що python-webkit
і python-gtk2
встановлені потім збережіть файли в тій же папці і запустити:
python example.py