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()