<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">you may have a look into the eric sources (default branch). I’ve included an execJavaScript method that works synchroneously. See the eric web site for how to clone the eric repository.</div><div class=""><br class=""></div><div class="">Detlev</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">Am 06.05.2016 um 11:28 schrieb Daan V. <<a href="mailto:daanv1987@gmail.com" class="">daanv1987@gmail.com</a>>:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">When I call the runJavaScript function of QWebEnginePage with a callback I can't block the python code on this call. I've tried sleeping, "spinning the event loop" (Kovid Goyal - <a href="https://riverbankcomputing.com/pipermail/pyqt/2015-January/035324.html" class="">https://riverbankcomputing.com/pipermail/pyqt/2015-January/035324.html</a>) and a combination of both. The example below shows how the "call_js_with_callback" keeps waiting.</div><div class=""><br class=""></div><div class="">When this while loop is removed from "call_js_with_callback" the callback actually happens. This means in an asynchronous environment this would not be an issue, but when porting a legacy project which was not written with asynchronous behavior in mind there is no quick way to port. Can anyone tell me if this is correct or if I've made a mistake and/or there is a workaround I can use?</div><div class=""><br class=""></div><div class="">Another interesting thing is that a callback method declared as I have it will crash unless the @pyqtSlot() is changed in an @pyqtSlot(str) (or something similar I assume). With @pyqtSlot() the callback will retrieve None as parameter and a silent crash of the application happens. Maybe this can be added to the <a href="http://pyqt.sourceforge.net/Docs/PyQt5/api/qwebenginepage.html" class="">http://pyqt.sourceforge.net/Docs/PyQt5/api/qwebenginepage.html</a> page or an error message can be returned when the callback fails.</div><div class=""><br class=""></div><div class="">Regards and thanks in advance,</div><div class=""><br class=""></div><div class="">Daan Veltman</div><div class=""><br class=""></div><div class=""><font face="monospace, monospace" class="">from PyQt5.Qt import *</font></div><div class=""><font face="monospace, monospace" class="">from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineScript, QWebEngineView</font></div><div class=""><font face="monospace, monospace" class="">from time import sleep</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">class WebPage(QWebEnginePage):</font></div><div class=""><font face="monospace, monospace" class="">    javascript_is_ready = False</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">    @pyqtSlot()</font></div><div class=""><font face="monospace, monospace" class="">    def html_ready(self):</font></div><div class=""><font face="monospace, monospace" class="">        print 'html_ready'</font></div><div class=""><font face="monospace, monospace" class="">        self.html_ready = True</font></div><div class=""><font face="monospace, monospace" class="">        self.call_js_with_callback()</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">    def call_js_with_callback(self):</font></div><div class=""><font face="monospace, monospace" class="">        print 'call_js_with_callback'</font></div><div class=""><font face="monospace, monospace" class="">        self.runJavaScript('js_function("with_callback")', self.callback)</font></div><div class=""><font face="monospace, monospace" class="">        while not self.javascript_is_ready:</font></div><div class=""><font face="monospace, monospace" class="">            print 'processing events'</font></div><div class=""><font face="monospace, monospace" class="">            QApplication.instance().processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents)</font></div><div class=""><font face="monospace, monospace" class="">            sleep(0.5)<br class=""></font></div><div class=""><font face="monospace, monospace" class="">        print 'through with sleeping!'</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">    @pyqtSlot(str)</font></div><div class=""><font face="monospace, monospace" class="">    def callback(self, none):</font></div><div class=""><font face="monospace, monospace" class="">        print 'calling back!', none</font></div><div class=""><font face="monospace, monospace" class="">        self.javascript_is_ready = True</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">app = QApplication([])</font></div><div class=""><font face="monospace, monospace" class="">page = WebPage()</font></div><div class=""><font face="monospace, monospace" class="">view = QWebEngineView()</font></div><div class=""><font face="monospace, monospace" class="">view.setPage(page)</font></div><div class=""><font face="monospace, monospace" class="">channel = QWebChannel(page)</font></div><div class=""><font face="monospace, monospace" class="">channel.registerObject('page', page)</font></div><div class=""><font face="monospace, monospace" class="">page.setWebChannel(channel)</font></div><div class=""><font face="monospace, monospace" class="">view.setHtml(</font></div><div class=""><font face="monospace, monospace" class="">            '<html>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '  <body>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <script src="<a href="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js" class="">https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js</a>"></script>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <script type="text/javascript" src="<a href="https://rawgit.com/qtproject/qtwebchannel/dev/src/webchannel/qwebchannel.js" class="">https://rawgit.com/qtproject/qtwebchannel/dev/src/webchannel/qwebchannel.js</a>"></script>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <p>Hello world!</p>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <script type="text/javascript">' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '        function js_function(text) {' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '            alert("js_function! " + text);' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '            }' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    </script>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <script type="text/javascript">' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '        $(document).ready(function(){' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '            alert("document ready");' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '            new QWebChannel(qt.webChannelTransport, function (channel) {' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '                page = channel.objects.page;' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '                page.html_ready();' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '            });' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '        });' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    </script>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '    <p>Done!</p>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '  </body>' + '\n'</font></div><div class=""><font face="monospace, monospace" class="">            '</html>')</font></div><div class=""><font face="monospace, monospace" class="">view.show()</font></div><div class=""><font face="monospace, monospace" class="">app.exec_()</font></div><div class=""><font face="monospace, monospace" class="">print 'exit'</font></div><div class=""><br class=""></div></div>
_______________________________________________<br class="">PyQt mailing list    <a href="mailto:PyQt@riverbankcomputing.com" class="">PyQt@riverbankcomputing.com</a><br class=""><a href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt" class="">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a></div></blockquote></div><br class=""><div class="">
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  "><div class="">Detlev Offenbach</div><div class=""><a href="mailto:detlev@die-offenbachs.de" class="">detlev@die-offenbachs.de</a></div><div class=""><br class=""></div></span><br class="Apple-interchange-newline">

</div>
<br class=""></div></body></html>