[PyQt] Synchronous WebView.load()

alanm me at alandmoore.com
Fri Jul 2 14:47:30 BST 2010


On Friday 02 July 2010 3:04:40 am you wrote:
> On Fri, 02 Jul 2010 00:31:40 -0500, alan moore <me at alandmoore.com> wrote:
> >> As I understand it, the webview doesn't actually load the page and
> 
> update
> 
> >> itself until the method call returns; at which point it loads the new
> >> page and
> >> updates the history.
> 
> No, the load starts straight away but may not finish until some time later
> (probably after the method returns).
> 
> The view will update itself when it has enough of the page loaded to be
> usefully displayed.
> 
> The display won't actually change until the even loop runs.
> 

Thanks for the response.  From my experimenting with this, apparently the 
history doesn't update until after the display does.  I tried something like 
this:

def reset_browser(self):
    self.webview.load(self.homepage)
    while self.webview.history().currentItem().url() != self.homepage:
        pass
    self.webview.history().clear()

With the idea being that I'd wait until the history had changed to clear it, 
but it never changed.  The while loop went on infinitely.

> > To illustrate the problem I'm having a little more clearly, I've
> > attached a sample script.  The script is supposed to conduct a brief
> > tour of a list of websites when you hit the "go" button on the browser
> > toolbar.  Each site shows for five seconds, then the next on loads.
> > 
> > Only that's not what happens.  If you run it, you'll see that hitting
> > "go" causes the browser to hang for about 20 seconds, then the final
> > comment is all that shows.  In other words, for the whole duration of
> > the method call, the main window is asleep.
> > 
> > I guess this is just another instance of the trouble I was running into
> > on my other program, which I posted a demonstration script for earlier
> > today.  I would really appreciate any help on this matter.
> 
> You need to get rid of your loop and sleep() and connect to the
> QWebView.loadFinished() signal. In the connected slot start a timer for 5
> seconds. When that timer times out you can then set the next URL.
> 
> Phil

I can see how that works for this example.  In the case of my original 
program, I'm not so sure.  I can't connect webview.history().clear() to 
loadFinished(), or else every single page load will clear the history.  And I 
can't connect and disconnect in the same callback, because it won't be 
processed until the callback exits.

Thanks again for your help.


More information about the PyQt mailing list