0

I have a wx python application with wx.html.HtmlWindow window:

class MyHtmlWindow(wx.html.HtmlWindow):

Method SetPage is used to update html content on the window:

def OpenURL(self, url, save_scroll_pos=True):
    def callback(src, url, save_scroll_pos):
        pos = self.GetViewStart()[1]
        self.SetPage(src)
        if save_scroll_pos:
            self.Scroll(0, pos)
    def errback(err): 
        self.SetPage('<html>Failed:<br>%s</html>' % err.getErrorMessage())

    d = self.DownloadURL(url)
    d.addCallback(callback, url, save_scroll_pos)
    d.addErrback(errback)

I want to save the current scroll position of the page after opening and this code is working. Only one problem, and this is big problem for me: it is rendering html page twice. First after self.SetPage and second after self.Scroll.

So each time I call self.OpenURL I see the page is blinking. It scrolls to the top and right after to the needed position.

I was trying to fix it by handling EVT_PAINT:

    self.Bind(wx.EVT_PAINT, self.OnPaintEvt)        

But self.OnPaintEvt is calling after self.Scroll - so this way not for me.

Any Ideas?

Veselin Penev
  • 77
  • 1
  • 5

1 Answers1

0

Great Thanks to Wx Developers. They provide very usefull methods: Freeze and Thaw. This is very easy solution:

def OpenURL(self, url, save_scroll_pos=True):
    def callback(src, url, save_scroll_pos):
        pos = self.GetViewStart()[1]
        self.Freeze()
        self.SetPage(src)
        if save_scroll_pos:
            self.Scroll(0, pos)
        self.Thaw()

    def errback(err): 
        self.SetPage('<html>Failed:<br>%s</html>' % err.getErrorMessage())

    d = self.DownloadURL(url)
    d.addCallback(callback, url, save_scroll_pos)
    d.addErrback(errback)

No blinking at all! :-)

Veselin Penev
  • 77
  • 1
  • 5