jon*_*con 31 python gtk webkit application-development
我正在编写一个小型 Python 和 WebKit 应用程序;我使用 WebKit 作为我的应用程序的 UI。
我想要做的是在 WebKit 中创建一个交互元素(即组合框或一组可点击区域),当用户与这些元素交互时,我可以调用 Python 回调进行一些处理,然后使用新讯息。
这是我想要做的一个例子:
on_combo_selected()将在我的 Python 脚本中调用,然后获取一些数据。我怎样才能做到这一点?
sil*_*sil 31
从嵌入式 WebKit 小部件到控制 Python 程序的通信方式
Gtk 或 Qt:
window.status从 JavaScript设置;在 Python 中捕获相应的事件document.title从 JavaScript设置;在 Python 中捕获相应的事件x-my-app:thing1/thing2/thing3);navigation-policy-decision-requested在 Python 中捕获事件并查看被导航到的 URL,如果它是您的自定义 URL 方案,则处理它仅限 Qt:
frame.addToJavaScriptWindowObject向 JavaScript 全局命名空间添加(专门设计的)Python 对象;从 JavaScript 调用它的方法。(有关示例,请参见http://pysnippet.blogspot.com/2010/01/calling-python-from-javascript-in-pyqts.html。)理论上应该行得通但实际上行不通的方法,非常好
从 Python 到 JavaScript 的通信方式
webview.execute_script(js_code). 请注意,如果您使用 JS 传递变量值,最好对它们进行 JSON 编码;这样你就可以少担心转义了,而且 JS 可以本地读取 JSON这是一些示例 Gtk 代码:
from gi.repository import Gtk,WebKit
import json
w = Gtk.Window()
v = WebKit.WebView()
sw = Gtk.ScrolledWindow()
w.add(sw)
sw.add(v)
w.set_size_request(400,300)
w.connect("destroy", lambda q: Gtk.main_quit())
def window_title_change(v, param):
if not v.get_title():
return
if v.get_title().startswith("msgtopython:::"):
message = v.get_title().split(":::",1)[1]
# Now, send a message back to JavaScript
return_message = "You chose '%s'. How interesting." % message
v.execute_script("jscallback(%s)" % json.dumps(return_message))
v.connect("notify::title", window_title_change)
v.load_html_string("""<!doctype html>
<html>
<head>
<title>A demo</title>
<style>
body { font-family: Ubuntu, sans-serif; }
h1 { font-size: 1.3em; }
</style>
<body>
<h1>A tiny JavaScript demonstration</h1>
<form>
<p>What's your favourite thing about Jono? <select>
<option>------choose one------</option>
<option>his beard</option>
<option>his infectious sense of humour</option>
<option>his infectious diseases</option>
<option>his guitar ability</option>
<option>his wife</option>
</select></p>
</form>
<p id="out"></p>
<script>
document.querySelector("select").addEventListener("change", function() {
var chosenOption = this.options[this.selectedIndex].text;
// Now send that text back to Python by setting the title
document.title = "msgtopython:::" + chosenOption;
}, false);
function jscallback(msg) {
document.getElementById("out").innerHTML = msg;
}
</script>
</body>
</html>
""", "file:///")
w.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
Flo*_*sch 18
我已经有一段时间没有玩这个了,但这就是我所做的:
使用类似的东西
<form>
<select onchange="location.href='mycombo://'+this.value">
<option>foo</option>
<option>bar</option>
<option>baz</option>
</select>
</form>
Run Code Online (Sandbox Code Playgroud)
在您的 HTML 中。因此,当用户选择一个项目时,mycombo会调用具有所选值的-URI。要捕获此连接处理程序到您的 WebView 的navigation-requested信号:
self.webview.connect("navigation-requested", self.on_navigation_requested)
Run Code Online (Sandbox Code Playgroud)
在您的信号处理程序中,您检查请求是否针对mycomboURI。如果是这样,请致电on_combo_selected:
def on_navigation_requested(self, view, frame, req, data=None):
uri = req.get_uri()
scheme, path=uri.split(':', 1)
if scheme == 'mycombo':
self.on_combo_selected(path)
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
要更新您的 WebView,请使用其execute_script函数运行一些执行更新的 JavaScript 代码,例如:
self.webview.execute_script("document.title='Updated!';")
Run Code Online (Sandbox Code Playgroud)