There is a new browser module available in phoenix (for python 3):
https://wxpython.org/Phoenix/docs/html/w...kCtrl.html
Take a look and perhaps try it out.
Here's the demo code:
#!/usr/bin/env python
import wx
import os
import sys
try:
dirName = os.path.dirname(os.path.abspath(__file__))
except:
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(os.path.split(dirName)[0])
try:
from agw import hyperlink as hl
except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.agw.hyperlink as hl
#----------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
self.SetFont(wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False))
sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(sizer)
# Creator credits
text1 = wx.StaticText(self, -1, "HyperLinkCtrl Example By Andrea Gavana")
text1.SetFont(wx.Font(9, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, 'Verdana'))
sizer.Add((0,10))
sizer.Add(text1, 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10)
text2 = wx.StaticText(self, -1, "Latest Revision: 11 May 2005")
text2.SetFont(wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, 'Verdana'))
sizer.Add(text2, 0, wx.LEFT, 10)
sizer.Add((0,25))
# Default Web links:
self._hyper1 = hl.HyperLinkCtrl(self, wx.ID_ANY, "wxPython Main Page",
URL="http://www.wxpython.org/")
sizer.Add(self._hyper1, 0, wx.ALL, 10)
# Web link with underline rollovers, opens in window
self._hyper2 = hl.HyperLinkCtrl(self, wx.ID_ANY, "My Home Page",
URL="http://xoomer.virgilio.it/infinity77/")
sizer.Add(self._hyper2, 0, wx.ALL, 10)
self._hyper2.Bind(hl.EVT_HYPERLINK_MIDDLE, self.OnMiddleLink)
self._hyper2.AutoBrowse(False)
self._hyper2.SetColours("BLUE", "BLUE", "BLUE")
self._hyper2.EnableRollover(True)
self._hyper2.SetUnderlines(False, False, True)
self._hyper2.SetBold(True)
self._hyper2.OpenInSameWindow(True) # middle click to open in window
self._hyper2.SetToolTip(wx.ToolTip("Middle-click to open in browser window"))
self._hyper2.UpdateLink()
# Intense link examples..
self._hyper3 = hl.HyperLinkCtrl(self, wx.ID_ANY, "wxPython Mail Archive",
URL="http://lists.wxwidgets.org/")
sizer.Add(self._hyper3, 0, wx.ALL, 10)
self._hyper3.Bind(hl.EVT_HYPERLINK_RIGHT, self.OnRightLink)
self._hyper3.SetLinkCursor(wx.CURSOR_QUESTION_ARROW)
self._hyper3.SetColours("DARK GREEN", "RED", "NAVY")
self._hyper3.SetUnderlines(False, False, False)
self._hyper3.EnableRollover(True)
self._hyper3.SetBold(True)
self._hyper3.DoPopup(False)
self._hyper3.UpdateLink()
self._hyper4 = hl.HyperLinkCtrl(self, wx.ID_ANY,
"Open Google In Current Browser Window?",
URL="http://www.google.com")
sizer.Add(self._hyper4, 0, wx.ALL, 10)
self._hyper4.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLink)
self._hyper4.SetToolTip(wx.ToolTip("Click link for yes, no, cancel dialog"))
self._hyper4.AutoBrowse(False)
def OnLink(self, event):
# Goto URL, demonstrates attempt to open link in current window:
strs = "Open Google In Current Browser Window "
strs = strs + "(NO Opens Google In Another Browser Window)?"
nResult = wx.MessageBox(strs, "HyperLinkCtrl", wx.YES_NO |
wx.CANCEL | wx.ICON_QUESTION, self)
if nResult == wx.YES:
self._hyper4.GotoURL("http://www.google.com", True, True)
elif nResult == wx.NO:
self._hyper4.GotoURL("http://www.google.com", True, False)
def OnRightLink(self, event):
pos = self._hyper3.GetPosition() + event.GetPosition()
menuPopUp = wx.Menu("Having a nice day?")
ID_MENU_YES = wx.NewId()
ID_MENU_NO = wx.NewId()
menuPopUp.Append(ID_MENU_YES, "Yes, absolutely!")
menuPopUp.Append(ID_MENU_NO, "I've had better")
self.PopupMenu(menuPopUp)
menuPopUp.Destroy()
def OnMiddleLink(self, event):
self._hyper2.GotoURL("http://xoomer.virgilio.it/infinity77/",
True, True)
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = hl.__doc__
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
You'll need run.py as well:
#!/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)