3 This demo shows how to embed an ActiveX control in a wxPython
4 application, (Win32 only.)
7 The MakeActiveXClass function dynamically builds a new Class on the
8 fly, that has the same signature and semantics as wxWindow. This
9 means that when you call the function you get back a new class that
10 you can use just like wxWindow, (set the size and position, use in a
11 sizer, etc.) except its contents will be the COM control.
14 This demo embeds the Internet Explorer WebBrowser control, and shows
15 how to receive events from the COM control. (The title bar and status
16 bar are updated as pages change, in addition to the log messages being
21 # 11/24/2003 - Jeff Grimmett (grimmtooth@softhome.net)
29 if wx
.Platform
== '__WXMSW__':
30 import wx
.lib
.activexwrapper
as ax
31 import win32com
.client
.gencache
34 browserModule
= win32com
.client
.gencache
.EnsureModule(
35 "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1
38 raise ImportError("IE4 or greater does not appear to be installed.")
41 #----------------------------------------------------------------------
43 class TestPanel(wx
.Window
):
44 def __init__(self
, parent
, log
, frame
=None):
47 style
=wx
.CLIP_CHILDREN|wx
.NO_FULL_REPAINT_ON_RESIZE
52 self
.current
= "http://wxPython.org/"
56 self
.titleBase
= frame
.GetTitle()
58 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
59 btnSizer
= wx
.BoxSizer(wx
.HORIZONTAL
)
61 # Make a new class that derives from the WebBrowser class in the
62 # COM module imported above. This class also derives from wxWindow and
63 # implements the machinery needed to integrate the two worlds.
64 theClass
= ax
.MakeActiveXClass(
65 browserModule
.WebBrowser
, eventObj
= self
68 # Create an instance of that class
69 self
.ie
= theClass(self
, -1) ##, style=wxSUNKEN_BORDER)
72 btn
= wx
.Button(self
, wx
.NewId(), "Open", style
=wx
.BU_EXACTFIT
)
73 self
.Bind(wx
.EVT_BUTTON
, self
.OnOpenButton
, id=btn
.GetId())
74 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
76 btn
= wx
.Button(self
, wx
.NewId(), "Home", style
=wx
.BU_EXACTFIT
)
77 self
.Bind(wx
.EVT_BUTTON
, self
.OnHomeButton
, id=btn
.GetId())
78 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
80 btn
= wx
.Button(self
, wx
.NewId(), "<--", style
=wx
.BU_EXACTFIT
)
81 self
.Bind(wx
.EVT_BUTTON
, self
.OnPrevPageButton
, id=btn
.GetId())
82 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
84 btn
= wx
.Button(self
, wx
.NewId(), "-->", style
=wx
.BU_EXACTFIT
)
85 self
.Bind(wx
.EVT_BUTTON
, self
.OnNextPageButton
, id=btn
.GetId())
86 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
88 btn
= wx
.Button(self
, wx
.NewId(), "Stop", style
=wx
.BU_EXACTFIT
)
89 self
.Bind(wx
.EVT_BUTTON
, self
.OnStopButton
, id=btn
.GetId())
90 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
92 btn
= wx
.Button(self
, wx
.NewId(), "Search", style
=wx
.BU_EXACTFIT
)
93 self
.Bind(wx
.EVT_BUTTON
, self
.OnSearchPageButton
, id=btn
.GetId())
94 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
96 btn
= wx
.Button(self
, wx
.NewId(), "Refresh", style
=wx
.BU_EXACTFIT
)
97 self
.Bind(wx
.EVT_BUTTON
, self
.OnRefreshPageButton
, id=btn
.GetId())
98 btnSizer
.Add(btn
, 0, wx
.EXPAND|wx
.ALL
, 2)
100 txt
= wx
.StaticText(self
, -1, "Location:")
101 btnSizer
.Add(txt
, 0, wx
.CENTER|wx
.ALL
, 2)
103 self
.location
= wx
.ComboBox(self
, wx
.NewId(), "", style
=wx
.CB_DROPDOWN
)
104 self
.Bind(wx
.EVT_COMBOBOX
, self
.OnLocationSelect
, id=self
.location
.GetId())
105 self
.Bind(wx
.EVT_KEY_UP
, self
.OnLocationKey
, self
.location
)
106 self
.Bind(wx
.EVT_CHAR
, self
.IgnoreReturn
, self
.location
)
107 btnSizer
.Add(self
.location
, 1, wx
.EXPAND|wx
.ALL
, 2)
109 sizer
.Add(btnSizer
, 0, wx
.EXPAND
)
110 sizer
.Add(self
.ie
, 1, wx
.EXPAND
)
112 self
.ie
.Navigate(self
.current
)
113 self
.location
.Append(self
.current
)
116 self
.SetAutoLayout(True)
117 self
.Bind(wx
.EVT_SIZE
, self
.OnSize
)
118 self
.Bind(wx
.EVT_WINDOW_DESTROY
, self
.OnDestroy
)
121 def ShutdownDemo(self
):
122 # put the frame title back
124 self
.frame
.SetTitle(self
.titleBase
)
127 def OnDestroy(self
, evt
):
134 def OnSize(self
, evt
):
138 def OnLocationSelect(self
, evt
):
139 url
= self
.location
.GetStringSelection()
140 self
.log
.write('OnLocationSelect: %s\n' % url
)
141 self
.ie
.Navigate(url
)
143 def OnLocationKey(self
, evt
):
144 if evt
.KeyCode() == wx
.WXK_RETURN
:
145 URL
= self
.location
.GetValue()
146 self
.location
.Append(URL
)
147 self
.ie
.Navigate(URL
)
151 def IgnoreReturn(self
, evt
):
153 if evt
.KeyCode() != wx
.WXK_RETURN
:
156 def OnOpenButton(self
, event
):
157 dlg
= wx
.TextEntryDialog(self
, "Open Location",
158 "Enter a full URL or local path",
159 self
.current
, wx
.OK|wx
.CANCEL
)
163 if dlg
.ShowModal() == wx
.ID_OK
:
164 self
.current
= dlg
.GetValue()
165 self
.ie
.Navigate(self
.current
)
169 def OnHomeButton(self
, event
):
170 self
.ie
.GoHome() ## ET Phone Home!
172 def OnPrevPageButton(self
, event
):
175 def OnNextPageButton(self
, event
):
178 def OnStopButton(self
, evt
):
181 def OnSearchPageButton(self
, evt
):
184 def OnRefreshPageButton(self
, evt
):
188 # The following event handlers are called by the web browser COM
189 # control since we passed self to MakeActiveXClass. It will look
190 # here for matching attributes and call them if they exist. See the
191 # module generated by makepy for details of method names, etc.
192 def OnBeforeNavigate2(self
, pDisp
, URL
, *args
):
193 self
.log
.write('OnBeforeNavigate2: %s\n' % URL
)
195 def OnNavigateComplete2(self
, pDisp
, URL
):
196 self
.log
.write('OnNavigateComplete2: %s\n' % URL
)
198 self
.location
.SetValue(URL
)
200 def OnTitleChange(self
, text
):
201 self
.log
.write('OnTitleChange: %s\n' % text
)
203 self
.frame
.SetTitle(self
.titleBase
+ ' -- ' + text
)
205 def OnStatusTextChange(self
, text
):
206 self
.log
.write('OnStatusTextChange: %s\n' % text
)
208 self
.frame
.SetStatusText(text
)
211 #----------------------------------------------------------------------
212 # for the demo framework...
214 def runTest(frame
, nb
, log
):
215 if wx
.Platform
== '__WXMSW__':
216 win
= TestPanel(nb
, log
, frame
)
219 dlg
= wx
.MessageDialog(frame
, 'This demo only works on MSW.',
220 'Sorry', wx
.OK | wx
.ICON_INFORMATION
)
227 #----------------------------------------------------------------------
230 if __name__
== '__main__':
231 class TestFrame(wx
.Frame
):
234 self
, None, -1, "ActiveX test -- Internet Explorer",
236 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
239 self
.CreateStatusBar()
240 self
.tp
= TestPanel(self
, sys
.stdout
, self
)
241 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
243 def OnCloseWindow(self
, evt
):
247 app
= wx
.PySimpleApp()