ich eine Probe pyside Demo, die ich geschaffen, um die Webkit-Browser Kommunikation mit Python zu sehen ... Ich habe zwei Tasten in webkitpyside Anwendung mit asynchronen Funktionsausführung
Taste 1 - wenn sie angeklickt es schläft für 10 Sekunden und druckt dann eine Nachricht
button2 - wenn angeklickt wird, druckt es sofort eine Nachricht.
Wenn ich auf die Taste 1 geklickt haben, apps die ganze gefriert und wartet auf Python schlafen zu beenden, dies bedeutet, dass ich nicht auf die Schaltfläche klicken 2 kann einige andere Sachen zu tun. Wie kann ich eine asynchrone Methode zwischen Funktionsaufrufen implementieren?
Meine Python-Codes sind unter
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_()
FRAGE
Wie kann ich auf button 1
in webkit klicken und lassen etwas im Hintergrund Python tun, wenn die Taste 1 gedrückt wird? (So dass button 2
Funktion muss nicht für die Taste 1 Funktion warten, bis zum Ende)
Bitte diese Demo verwenden und verbessert es ... sehr geschätzt
Ich hatte mit QThreads experimentiert, nachdem ich meine Frage gepostet hatte und es funktionierte..Ich wartete darauf, dass jemand eine solche Antwort posten konnte..Exzellente Arbeit! – repzero
Nur ein kleines Problem..Sie haben keine Parameter an super in der Klasse LongPythonThread übergeben, die eine Ausnahme auslösen..aber ich habe es in meinem Beispiel..thanks – repzero
hinzugefügt Das ist ein Unterschied zwischen der super() -Funktion in Py2 und Py3. Der Code, den ich geschrieben habe, funktioniert mit Python3, aber Ihre Modifikation lässt es mit beiden funktionieren. –