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 Exploer 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 from wxPython
.wx
import *
23 if wxPlatform
== '__WXMSW__':
24 from wxPython
.lib
.activexwrapper
import MakeActiveXClass
25 import win32com
.client
.gencache
28 browserModule
= win32com
.client
.gencache
.EnsureModule("{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
30 raise ImportError("IE4 or greater does not appear to be installed.")
33 #----------------------------------------------------------------------
35 class TestPanel(wxWindow
):
36 def __init__(self
, parent
, log
, frame
=None):
37 wxWindow
.__init
__(self
, parent
, -1,
38 style
=wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE
)
41 self
.current
= "http://wxPython.org/"
44 self
.titleBase
= frame
.GetTitle()
47 sizer
= wxBoxSizer(wxVERTICAL
)
48 btnSizer
= wxBoxSizer(wxHORIZONTAL
)
50 # Make a new class that derives from the WebBrowser class in the
51 # COM module imported above. This class also derives from wxWindow and
52 # implements the machinery needed to integrate the two worlds.
53 theClass
= MakeActiveXClass(browserModule
.WebBrowser
,
56 # Create an instance of that class
57 self
.ie
= theClass(self
, -1) ##, style=wxSUNKEN_BORDER)
60 btn
= wxButton(self
, wxNewId(), "Open", style
=wxBU_EXACTFIT
)
61 EVT_BUTTON(self
, btn
.GetId(), self
.OnOpenButton
)
62 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
64 btn
= wxButton(self
, wxNewId(), "Home", style
=wxBU_EXACTFIT
)
65 EVT_BUTTON(self
, btn
.GetId(), self
.OnHomeButton
)
66 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
68 btn
= wxButton(self
, wxNewId(), "<--", style
=wxBU_EXACTFIT
)
69 EVT_BUTTON(self
, btn
.GetId(), self
.OnPrevPageButton
)
70 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
72 btn
= wxButton(self
, wxNewId(), "-->", style
=wxBU_EXACTFIT
)
73 EVT_BUTTON(self
, btn
.GetId(), self
.OnNextPageButton
)
74 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
76 btn
= wxButton(self
, wxNewId(), "Stop", style
=wxBU_EXACTFIT
)
77 EVT_BUTTON(self
, btn
.GetId(), self
.OnStopButton
)
78 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
80 btn
= wxButton(self
, wxNewId(), "Search", style
=wxBU_EXACTFIT
)
81 EVT_BUTTON(self
, btn
.GetId(), self
.OnSearchPageButton
)
82 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
84 btn
= wxButton(self
, wxNewId(), "Refresh", style
=wxBU_EXACTFIT
)
85 EVT_BUTTON(self
, btn
.GetId(), self
.OnRefreshPageButton
)
86 btnSizer
.Add(btn
, 0, wxEXPAND|wxALL
, 2)
88 txt
= wxStaticText(self
, -1, "Location:")
89 btnSizer
.Add(txt
, 0, wxCENTER|wxALL
, 2)
91 self
.location
= wxComboBox(self
, wxNewId(), "", style
=wxCB_DROPDOWN
)
92 EVT_COMBOBOX(self
, self
.location
.GetId(), self
.OnLocationSelect
)
93 EVT_KEY_UP(self
.location
, self
.OnLocationKey
)
94 EVT_CHAR(self
.location
, self
.IgnoreReturn
)
95 btnSizer
.Add(self
.location
, 1, wxEXPAND|wxALL
, 2)
97 sizer
.Add(btnSizer
, 0, wxEXPAND
)
98 sizer
.Add(self
.ie
, 1, wxEXPAND
)
100 self
.ie
.Navigate(self
.current
)
101 self
.location
.Append(self
.current
)
104 self
.SetAutoLayout(true
)
105 EVT_SIZE(self
, self
.OnSize
)
108 def OnSize(self
, evt
):
116 def OnLocationSelect(self
, evt
):
117 url
= self
.location
.GetStringSelection()
118 self
.log
.write('OnLocationSelect: %s\n' % url
)
119 self
.ie
.Navigate(url
)
121 def OnLocationKey(self
, evt
):
122 if evt
.KeyCode() == WXK_RETURN
:
123 URL
= self
.location
.GetValue()
124 self
.location
.Append(URL
)
125 self
.ie
.Navigate(URL
)
129 def IgnoreReturn(self
, evt
):
131 if evt
.KeyCode() != WXK_RETURN
:
134 def OnOpenButton(self
, event
):
135 dlg
= wxTextEntryDialog(self
, "Open Location",
136 "Enter a full URL or local path",
137 self
.current
, wxOK|wxCANCEL
)
139 if dlg
.ShowModal() == wxID_OK
:
140 self
.current
= dlg
.GetValue()
141 self
.ie
.Navigate(self
.current
)
144 def OnHomeButton(self
, event
):
145 self
.ie
.GoHome() ## ET Phone Home!
147 def OnPrevPageButton(self
, event
):
150 def OnNextPageButton(self
, event
):
153 def OnStopButton(self
, evt
):
156 def OnSearchPageButton(self
, evt
):
159 def OnRefreshPageButton(self
, evt
):
164 # The following event handlers are called by the web browser COM
165 # control since we passed self to MakeActiveXClass. It will look
166 # here for matching attributes and call them if they exist. See the
167 # module generated by makepy for details of method names, etc.
168 def OnBeforeNavigate2(self
, pDisp
, URL
, *args
):
169 self
.log
.write('OnBeforeNavigate2: %s\n' % URL
)
171 def OnNavigateComplete2(self
, pDisp
, URL
):
172 self
.log
.write('OnNavigateComplete2: %s\n' % URL
)
174 self
.location
.SetValue(URL
)
176 def OnTitleChange(self
, text
):
177 self
.log
.write('OnTitleChange: %s\n' % text
)
179 self
.frame
.SetTitle(self
.titleBase
+ ' -- ' + text
)
181 def OnStatusTextChange(self
, text
):
182 self
.log
.write('OnStatusTextChange: %s\n' % text
)
184 self
.frame
.SetStatusText(text
)
187 #----------------------------------------------------------------------
188 # for the demo framework...
190 def runTest(frame
, nb
, log
):
191 if wxPlatform
== '__WXMSW__':
192 win
= TestPanel(nb
, log
, frame
)
195 dlg
= wxMessageDialog(frame
, 'This demo only works on MSW.',
196 'Sorry', wxOK | wxICON_INFORMATION
)
203 #----------------------------------------------------------------------
206 if __name__
== '__main__':
207 class TestFrame(wxFrame
):
209 wxFrame
.__init
__(self
, None, -1, "ActiveX test -- Internet Explorer",
211 style
=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE
)
212 self
.CreateStatusBar()
213 self
.tp
= TestPanel(self
, sys
.stdout
, self
)
214 EVT_CLOSE(self
, self
.OnCloseWindow
)
216 def OnCloseWindow(self
, event
):
221 app
= wxPySimpleApp()