wx webview event - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Web Scraping & Web Development (https://python-forum.io/forum-13.html) +--- Thread: wx webview event (/thread-10714.html) |
wx webview event - ian - Jun-03-2018 when a webpage loading, it generates event more than once. Google in the code below, has the event fired twice. some webpage has more than 10 times. it is because of multiple frames or something. I want to wait for page fully loaded before continuing rest process. Is there a way to do it? Thanks. import wx import wx.html2 class MyBrowser(wx.Dialog): def __init__(self, *args, **kwds): wx.Dialog.__init__(self, *args, **kwds) sizer = wx.BoxSizer(wx.VERTICAL) self.browser = wx.html2.WebView.New(self) self.Bind(wx.html2.EVT_WEBVIEW_LOADED, self.On_Web_View_Loaded, self.browser) sizer.Add(self.browser, 1, wx.EXPAND, 10) self.SetSizer(sizer) self.SetSize((700, 700)) def On_Web_View_Loaded(self, event): print('Loading') if __name__ == '__main__': app = wx.App() dialog = MyBrowser(None, -1) dialog.browser.LoadURL("http://www.google.com") dialog.Show() app.MainLoop() RE: wx webview event - Larz60+ - Jun-03-2018 do you have the demo code loaded? There is a demo available for wx.html2 WebView that works. I'll post it here (Requires python 3 and wxpython phoenix). You need two modules: run.py #!/usr/bin/env python #---------------------------------------------------------------------------- # Name: run.py # Purpose: Simple framework for running individual demos # # Author: Robin Dunn # # Created: 6-March-2000 # Copyright: (c) 2000-2017 by Total Control Software # Licence: wxWindows license #---------------------------------------------------------------------------- """ This program will load and run one of the individual demos in this directory within its own frame window. Just specify the module name on the command line. """ import wx import wx.lib.inspection import wx.lib.mixins.inspection import sys, os # stuff for debugging print("Python %s" % sys.version) print("wx.version: %s" % wx.version()) ##print("pid: %s" % os.getpid()); input("Press Enter...") assertMode = wx.APP_ASSERT_DIALOG ##assertMode = wx.APP_ASSERT_EXCEPTION #---------------------------------------------------------------------------- class Log: def WriteText(self, text): if text[-1:] == '\n': text = text[:-1] wx.LogMessage(text) write = WriteText class RunDemoApp(wx.App, wx.lib.mixins.inspection.InspectionMixin): def __init__(self, name, module, useShell): self.name = name self.demoModule = module self.useShell = useShell wx.App.__init__(self, redirect=False) def OnInit(self): wx.Log.SetActiveTarget(wx.LogStderr()) self.SetAssertMode(assertMode) self.InitInspection() # for the InspectionMixin base class frame = wx.Frame(None, -1, "RunDemo: " + self.name, pos=(50,50), size=(200,100), style=wx.DEFAULT_FRAME_STYLE, name="run a sample") frame.CreateStatusBar() menuBar = wx.MenuBar() menu = wx.Menu() item = menu.Append(-1, "&Widget Inspector\tF6", "Show the wxPython Widget Inspection Tool") self.Bind(wx.EVT_MENU, self.OnWidgetInspector, item) item = menu.Append(wx.ID_EXIT, "E&xit\tCtrl-Q", "Exit demo") self.Bind(wx.EVT_MENU, self.OnExitApp, item) menuBar.Append(menu, "&File") ns = {} ns['wx'] = wx ns['app'] = self ns['module'] = self.demoModule ns['frame'] = frame frame.SetMenuBar(menuBar) frame.Show(True) frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame) win = self.demoModule.runTest(frame, frame, Log()) # a window will be returned if the demo does not create # its own top-level window if win: # so set the frame to a good size for showing stuff frame.SetSize((640, 480)) win.SetFocus() self.window = win ns['win'] = win frect = frame.GetRect() else: # It was probably a dialog or something that is already # gone, so we're done. frame.Destroy() return True self.SetTopWindow(frame) self.frame = frame #wx.Log.SetActiveTarget(wx.LogStderr()) #wx.Log.SetTraceMask(wx.TraceMessages) if self.useShell: # Make a PyShell window, and position it below our test window from wx import py shell = py.shell.ShellFrame(None, locals=ns) frect.OffsetXY(0, frect.height) frect.height = 400 shell.SetRect(frect) shell.Show() # Hook the close event of the test window so that we close # the shell at the same time def CloseShell(evt): if shell: shell.Close() evt.Skip() frame.Bind(wx.EVT_CLOSE, CloseShell) return True def OnExitApp(self, evt): self.frame.Close(True) def OnCloseFrame(self, evt): if hasattr(self, "window") and hasattr(self.window, "ShutdownDemo"): self.window.ShutdownDemo() evt.Skip() def OnWidgetInspector(self, evt): wx.lib.inspection.InspectionTool().Show() #---------------------------------------------------------------------------- def main(argv): useShell = False for x in range(len(sys.argv)): if sys.argv[x] in ['--shell', '-shell', '-s']: useShell = True del sys.argv[x] break if len(argv) < 2: print("Please specify a demo module name on the command-line") raise SystemExit # ensure the CWD is the demo folder demoFolder = os.path.realpath(os.path.dirname(__file__)) os.chdir(demoFolder) sys.path.insert(0, os.path.join(demoFolder, 'agw')) sys.path.insert(0, '.') name, ext = os.path.splitext(argv[1]) module = __import__(name) app = RunDemoApp(name, module, useShell) app.MainLoop() if __name__ == "__main__": main(sys.argv)and HTML2_WebView.py #!/usr/bin/env python import wx import wx.html2 as webview #---------------------------------------------------------------------- class TestPanel(wx.Panel): def __init__(self, parent, log, frame=None): self.log = log wx.Panel.__init__(self, parent, -1) self.current = "http://google.com/" self.frame = frame if frame: self.titleBase = frame.GetTitle() sizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) self.wv = webview.WebView.New(self) self.Bind(webview.EVT_WEBVIEW_NAVIGATING, self.OnWebViewNavigating, self.wv) self.Bind(webview.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.wv) btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoBack, btn) btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoForward, btn) btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) txt = wx.StaticText(self, -1, "Location:") btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2) self.location = wx.ComboBox( self, -1, "", style=wx.CB_DROPDOWN|wx.TE_PROCESS_ENTER) self.location.AppendItems(['http://wxPython.org', 'http://wxwidgets.org', 'http://google.com']) self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location) self.location.Bind(wx.EVT_TEXT_ENTER, self.OnLocationEnter) btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2) sizer.Add(btnSizer, 0, wx.EXPAND) sizer.Add(self.wv, 1, wx.EXPAND) self.SetSizer(sizer) self.wv.LoadURL(self.current) def ShutdownDemo(self): # put the frame title back if self.frame: self.frame.SetTitle(self.titleBase) # WebView events def OnWebViewNavigating(self, evt): # this event happens prior to trying to get a resource if evt.GetURL() == 'http://www.microsoft.com/': if wx.MessageBox("Are you sure you want to visit Microsoft?", style=wx.YES_NO|wx.ICON_QUESTION) == wx.NO: # This is how you can cancel loading a page. evt.Veto() def OnWebViewLoaded(self, evt): # The full document has loaded self.current = evt.GetURL() self.location.SetValue(self.current) # Control bar events def OnLocationSelect(self, evt): url = self.location.GetStringSelection() self.log.write('OnLocationSelect: %s\n' % url) self.wv.LoadURL(url) def OnLocationEnter(self, evt): url = self.location.GetValue() self.location.Append(url) self.wv.LoadURL(url) def OnOpenButton(self, event): dlg = wx.TextEntryDialog(self, "Open Location", "Enter a full URL or local path", self.current, wx.OK|wx.CANCEL) dlg.CentreOnParent() if dlg.ShowModal() == wx.ID_OK: self.current = dlg.GetValue() self.wv.LoadURL(self.current) dlg.Destroy() def OnPrevPageButton(self, event): self.wv.GoBack() def OnNextPageButton(self, event): self.wv.GoForward() def OnCheckCanGoBack(self, event): event.Enable(self.wv.CanGoBack()) def OnCheckCanGoForward(self, event): event.Enable(self.wv.CanGoForward()) def OnStopButton(self, evt): self.wv.Stop() def OnRefreshPageButton(self, evt): self.wv.Reload() #---------------------------------------------------------------------- def runTest(frame, nb, log): win = TestPanel(nb, log) return win #---------------------------------------------------------------------- overview = """<html><body> <h2><center>DemoName</center></h2> Say something nice here </body></html> """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])from command prompt: python HTML2_WebView.py |