MS Edge backend fails in Notebook (other than first page)

I have just tried and the “single browser fail” works for me if the page is visible:

  • create panel
  • add to notebook
  • make visible (SetSelection)
  • create webview

I.e. just re-ordered and added SetSelection:

    def make_web_page(self, title):
        page = wx.Panel(self.notebook_main_view)
        self.notebook_main_view.AddPage(page, title)
        self.notebook_main_view.SetSelection(self.notebook_main_view.PageCount-1)
        plot = webview.WebView.New(page, backend=BACKEND)
        plot.LoadURL("http://www.google.com")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(plot, 1, wx.EXPAND)
        page.SetSizer(sizer)

This does not help when you want multiple browser tabs.
I could make this work with on-demand creation, though.
I would consider this a better style anyway when working with resource intensive widgets.
When creating the browsers in an EVT_NOTEBOOK_PAGE_CHANGING handler, it fails, as expected as then the parent is not visible.

Here’s the full code:

import wx
import wx.html2 as webview
# from wx.lib.inspection import InspectionTool
# from wx.lib.agw.flatnotebook import FlatNotebook

NotebookClass = wx.Notebook
# NotebookClass = FlatNotebook
#BACKEND = webview.WebViewBackendDefault
BACKEND = webview.WebViewBackendEdge


class DVHAMainFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)

        self.notebook_main_view = NotebookClass(self, wx.ID_ANY)
        self.tab_keys = ['Browser 1', 'Browser 2', 'Browser 3']
        self._created = set()

        for key in self.tab_keys:
            self.make_web_page(key)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.notebook_main_view, 1, wx.EXPAND, 0)

        self.SetSizer(sizer)
        self.Layout()
        self.Center()

        self.make_browser(self.tab_keys[0])
        self.notebook_main_view.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.on_page_selection)

    def make_web_page(self, title):
        # just add a panel, but not yet a browser
        page = wx.Panel(self.notebook_main_view)
        self.notebook_main_view.AddPage(page, title)

    def on_page_selection(self, event):
        # when page is selected, check whether the browser has been created already
        index = event.GetSelection()
        key = self.tab_keys[index]
        if not key in self._created:
            self.make_browser(key)
        event.Skip()

    def make_browser(self, key):
        # on-demand creation of the browser
        index = self.tab_keys.index(key)
        page = self.notebook_main_view.GetPage(index)
        plot = webview.WebView.New(page, backend=BACKEND)
        plot.LoadURL("http://www.google.com")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(plot, 1, wx.EXPAND)
        page.SetSizer(sizer)
        page.Layout()
        self._created.add(key)


class MainApp(wx.App):
    def OnInit(self):
        self.SetAppName('DVH Analytics')
        self.frame = DVHAMainFrame(None, wx.ID_ANY, "", size=(800,600))
        self.SetTopWindow(self.frame)
        # InspectionTool().Show()
        self.frame.Show()
        return True


def start():
    app = MainApp()
    app.MainLoop()


if __name__ == "__main__":
    start()