帮同事写客户端,发现pyqt和wxpython的api何其的多,资料又少,写一个包含各种表单的客户端对我来说难度很大,于是想到使用webkit来渲染html,pyqt自然成了我的选择。
但是发现,平时在web开发中,html向web后台获取数据或者提交数据这样简单的事,在pyqt中我完全不知道怎么办,资料又各种少。
最后找到了对应的简单例子,但是获取表单数据的那个例子在怎么都不起作用(google翻来覆去的查都只有那个例子),正在要放弃的时候,又突然能用了,感觉醉了。由于pyqt完全不懂,用它也只是为了写个东西出来,所以不打算深究,既然能用了,就这样吧。。
下面是整合了的代码:
import sys
from PyQt4 import QtCore, QtGui, QtWebKit
import json
from urllib import unquote_plus
class StupidClass(QtCore.QObject):
def _pyVersion(self):
return json.dumps(sys.version)
pyVersion = QtCore.pyqtProperty(str, fget=_pyVersion)
class MyWebPage(QtWebKit.QWebPage):
formSubmitted = QtCore.pyqtSignal(QtCore.QUrl)
def acceptNavigationRequest(self, frame, req, nav_type):
if nav_type == QtWebKit.QWebPage.NavigationTypeFormSubmitted:
print 111
self.formSubmitted.emit(req.url())
return super(MyWebPage, self).acceptNavigationRequest(frame, req, nav_type)
def handleFormSubmitted(url):
elements = {}
for key, value in url.encodedQueryItems():
key = unquote_plus(bytes(key)).decode('utf8')
value = unquote_plus(bytes(value)).decode('utf8')
elements[key] = value
for item in elements.iteritems():
print '"%s" = "%s"' % item
def main():
app = QtGui.QApplication(sys.argv)
myObj = StupidClass()
browser= QtWebKit.QWebView()
browser.setPage(MyWebPage())
browser.page().mainFrame().addToJavaScriptWindowObject("pyObj", myObj)
browser.page().formSubmitted.connect(handleFormSubmitted)
browser.load(QtCore.QUrl("./StreamBlock.html"))
window = QtGui.QMainWindow()
window.setCentralWidget(browser)
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()StreamBlock.html内容:<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="./css/common.css">
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script>
$(document).ready(function(){
$(".cmn_btn").click(function(){
alert(pyObj.pyVersion);
})
})
</script>
</head>
<body>
<div>
<input type="button" class="cmn_btn" value="全选"/>
<input type="button" class="cmn_btn" value="新建"/>
<input type="button" class="cmn_btn" value="删除"/>
<form action="" type="post">
<input type="text" name="name"/>
<input type="submit"/>
</form>
</div>
<div>
<table
</div>
</body>
</html>
在这个例子里只能用page().load(),不能用page().setHtml()。form表单数据获取不到,没有深究,感兴趣的可以研究下。
可以看到,这个例子里面,python把数据传给了js,同时也能获取html form表单的数据。心好累,不过终于能愉快的写html/css/js了。
续:最后时间有限,没时间研究web和pyqt交互,所以就直接启动了一个django,把它弄成守护进程,如果启动客户端的时候这个守护进程没有起来就手动起一下
本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!
本文介绍如何利用PyQt的Webkit模块渲染HTML,并实现Python与JavaScript之间的数据交互,包括从Python向JS传递数据及从HTML表单获取数据。

255

被折叠的 条评论
为什么被折叠?



