Bạn có thể phát triển bằng HTML + Javascript cho giao diện bằng cách sử dụng khung WebKit được nhúng trong cửa sổ Gtk (điều này dễ thực hiện nhất trong Python). Phần khó nhất là giao tiếp với hệ thống từ ứng dụng HTML / Javascript của bạn.
Bạn có thể làm điều này bằng cách chuyển tin nhắn giữa Javascript và Python. Tuy nhiên, bạn sẽ phải viết logic hệ thống dưới dạng các hàm Python nhưng điều này khá dễ thực hiện.
Đây là một ví dụ đơn giản cho thấy giao tiếp giữa Python và Javascript. Trong ví dụ, HTML / Javascript hiển thị một nút, khi được nhấp sẽ gửi một mảng ["hello", "world"]
tới Python nối chuỗi đó thành một chuỗi "hello world" và gửi lại cho Javascript. Mã Python in một đại diện của mảng cho bàn điều khiển và mã Javascript bật lên một hộp cảnh báo hiển thị chuỗi.
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()
trang.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>
Mã python duy nhất bạn thực sự cần chú ý ở đây là mã từ def output(data):
đến cuối tệp nên khá dễ hiểu.
Để chạy, đảm bảo python-webkit
và python-gtk2
được cài đặt, sau đó lưu các tệp trong cùng một thư mục và chạy:
python example.py