У меня есть образец PySide демо, который я создал, чтобы увидеть связь WebKit браузера с питоном ... У меня есть две кнопки в WebKitPySide Применение при выполнении асинхронной функции
кнопка 1 - при нажатии она спит в течение 10 секунд, а затем печатает сообщение
button2 - при нажатии на него печатается сообщение немедленно.
Когда я нажал на кнопку 1, все приложения замирает и ждет питона, чтобы закончить сон, это означает, что я не могу нажать на кнопку 2, чтобы сделать некоторые другие вещи. Как реализовать асинхронный метод между вызовами функций?
Мои питона коды ниже
import sys,json
from time import sleep
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import QWebView, QWebSettings
from PySide.QtNetwork import QNetworkRequest
from PySide.QtCore import QObject, Slot, Signal
html_str="""<!doctype>
<html>
<body>hello world
<button id="button" >button1</button>
<button id="button2" >button2</button>
</body>
</html>
<script type="text/javascript">
document.getElementById("button").onclick=function(){
object.reply(" hello ");
}
document.getElementById("button2").onclick=function(){
object.reply2(" hello ");
}
function data_from_js(msg){
var tag=document.createElement('div');
tag.innerHTML="message from python";
document.body.appendChild(tag);
alert(msg['name']);
}
</script>
<style>
body{
border:solid black 1px;
}
</style>
</doctype>"""
class Qbutton(QObject):
from time import sleep
def __init__(self):
super(Qbutton,self).__init__()
@Slot(str)
def reply(self,recd):
#r=QMessageBox.information(self,"Info",msg)
msgBox = QMessageBox()
sleep(10)
msgBox.setText("python just said"+recd)
msgBox.exec_()
return "I am recieving pythonic data"
#r=QMessageBox.question(self,title,recd,QMessageBox.Yes | QMessageBox.No)
@Slot(str)
def reply2(self,recd):
msgBox = QMessageBox()
msgBox.setText("python just said"+recd+ " another time")
msgBox.exec_()
return "I am recieving pythonic data"
@Slot(str)
def send_tojs(self):
pass
class adstar_gui(QWidget):
def __init__(self):
super(adstar_gui,self).__init__()
self.setWindowTitle("Adstar Wordlist Generator")
self.setMaximumWidth(5000)
self.setMaximumHeight(5000)
self.setMinimumWidth(500)
self.setMinimumHeight(500)
self.show()
print "Sample window"
def closeEvent(self,event):
self.closeEvent()
if __name__=="__main__":
Qapp=QApplication(sys.argv)
t=QWebView()
t.setHtml(html_str)
button=Qbutton()
t.page().mainFrame().addToJavaScriptWindowObject("object",button)
t.show()
#t.page().mainFrame().evaluateJavaScript("data_from_js(%s);" % (json.dumps({'name':"My name is Junior"})))
QCoreApplication.processEvents()
#sys.exit(Qapp.exec_())
Qapp.exec_()
ВОПРОС
Как я могу нажать на button 1
в WebKit, и пусть питона сделать что-то в фоновом режиме, когда кнопка 1 нажата? (Так что button 2
функции не нужно ждать, пока кнопку 1 функцию, чтобы закончить)
Пожалуйста, используйте эту демку и улучшить его ... высоко ценится
Я экспериментировал с QThreads после публикации моего вопроса, и это сработало. Я ждал, что кто-то опубликует такой ответ. Отличная работа! – repzero
Немного о проблеме. Вы не передали параметры супер в классе LongPythonThread, который будет генерировать исключение .. но я добавил его в свой образец. Спасибо – repzero
. Это разница между функцией super() в Py2 и Py3. Код, который я написал, работает с Python3, но ваша модификация позволяет ему работать с обоими. –