Hi again,

To create an instance of the interface use:

ie  = Dispatch('InternetExplorer.Application')
# To get a document and body have to navigate
ie.Navigate('about:')
doc = ie.Document
body = doc.body
body.write('<h1 id=mytitle>Hello there</h1>')
ele = body.all('mytitle')

To catch events see the code in MainWindow.py. It doesn't work because it's
part of a bigger project, but you can see how things work.

Also another really good way of embedding IE is in a wxPython application.
In the wxPython demo application see the file ActiveXWrapper_IE.py

GBU
Matthew Sherborne


Use the attached files to play with:


----- Original Message -----
From: "Bill Bell" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, February 04, 2002 2:47 PM
Subject: Re: Using MSHTML in Python



Matthew, thanks.

I had given up on that problem. Given that Mark Hammond seemed to be saying
that what I wanted is impossible, I can hardly wait to try your code out.

Thanks again.

Bill

*********** REPLY SEPARATOR  ***********

On 2/4/2002 at 1:18 PM Matthew wrote:

>I saw your message on the net. Hope this helps...
>
>from win32com.client import Dispatch, getevents, gencache
>gencache.EnsureModule(pythoncom.MakeIID('{EAB22AC0-30C1-11CF-A7EB-0000C05BA
E0B}'), 0x0, 1, 1)
>gencache.EnsureModule(pythoncom.MakeIID('{3050F1C5-98B5-11CF-BB82-00AA00BDC
E0B}'), 0x0, 4, 0)
>
>:)
>
>__ORIGINAL_MESSAGE___
>
>I'm trying to do the equivalent of the MS 'walkall' example, in
>Python. Which would explain why I would use a statement like the
>following:
>
>MSHTMLIDispatch, MSHTMLIOleObject, MSHTMLIOleControl =
>CoCreateInstanceEx ( 'htmlfile', None, pythoncom .
>CLSCTX_INPROC_SERVER,  None, ( pythoncom . IID_IDispatch,
>axcontrol . IID_IOleObject, axcontrol . IID_IOleControl, ) )
>
>This works, at least in the sense that Python does not complain. (I
>haven't proceeded far enough to verify that MSHTML can
>successfully query my host for the parameters within it must work.)
>
>For those unfamiliar with the CoClass represented by 'htmlfile', it
>offers several Interfaces, including 'IHTMLDocument2'.
>
>However, when I enter the following statement:
>
>MSHTMLIDispatch.QueryInterface ( '{332C4425-26CB-11D0-B483-
>00C04FD90119}' )
>
>Python complains, "TypeError: There is no interface object
>registered that supports this IID."
>
>Notes:
>
>1. In fact, 'IHTMLDocument2' is the '(default)' for the key
>HKEY_CLASSES_ROOT\Interface\{332C4425-26CB-11D0-B483-
>00C04FD90119}.
>
>2. CoCreateInstance( CLSID_HTMLDocument, NULL,
>CLSCTX_INPROC_SERVER, IID_IHTMLDocument2,
>(LPVOID*)&g_pApp -> m_pMSHTML ))) from 'walkall' uses these
>constants for the IDs and yields something useful.
>
>Two items I'd appreciate comment about (or, IOW, please ease my
>torment):
>
>1. How to retrieve an artbitrary interface supported by a CoClass
>given some one of the elements in the tuple returned by
>CoCreateInstanceEx.
>
>2. Why doesn't QI cut it for me in this case?
>
>Thanks very much! Ou merci beaucoups!
>
>Bill
>
>Bill Bell, Software Developer




from win32com.client import *
cast = gencache.GetModuleForProgID('htmlfile')
cast2 = gencache.GetModuleForProgID('InternetExplorer.Application')

def _createDiv():
    div = doc3.createElement('div')
    style = div.style
    style2 = cast.IHTMLStyle2(style)
    style3 = cast.IHTMLStyle3(style)
    style2.position = 'absolute'
    style.top = 0
    style.left = 0
    style.overflow = 'scroll'
    style2.overflowX = 'hidden'
    style.width = 300
    style.height = 100
    style3.scrollbarBaseColor = '#3366CC'
    style.borderBottom = '2px solid black'
    style3.scrollbarHighlightColor = '#99CCFF'
    style3.scrollbarArrowColor = 'white'
    div.innerHTML = 'Hello'
    return div

b = Dispatch('InternetExplorer.Application')
b.Navigate('about:<h1 id=header>Hello</h1><iframe id=frm src="about:"></iframe>')
b.Visible = 1
doc1 = cast.IHTMLDocument2(b.Document)
header = doc1.all.item('header')
frm = doc1.all.item('frm')
frm2 = doc1.frames('frm')
doc2 = cast.IHTMLDocument2(frm2.document)
div = doc2.createElement('div')
cast.DispHTMLBody(doc2.body).appendChild(div)

popup = cast.DispHTMLWindow2(doc1.parentWindow).createPopup()
doc3 = cast.IHTMLDocument2(popup.document)
body = cast.DispHTMLBody(doc3.body)
div = _createDiv()


from win32com.client import getevents, gencache
from Area import Area
import traceback, pdb
from DesignPanel import DesignPanel
from exceptions import Exception

cast = gencache.GetModuleForProgID('htmlfile') # We'll need the actual python module 
that defines the html document, so we can type cast somethings
DocEvents = getevents('htmlfile')       # Get the document events object, we're going 
to inherit from it.

class MainWindow(DocEvents):

    def __init__(self, doc):
        DocEvents.__init__(self, doc)
        f = open("mainwindowres.html", "r") # Rather than navigate to the URL, I 
decided to 
        HTML = f.read()                 # to load it stright into a string, and dump 
it into
        f.close()                       # the borwser's document
        self.doc = doc
        doc.write(HTML)
        # Get some quick references to some of the elements in the document
        self.btnAdd = doc.all('btnAdd')
        self.btnDelete = doc.all('btnDelete')
        self.info = doc.all('info')
        self.statusBar = doc.all.item('statusBar')
        self.designPanel = DesignPanel(self)
        # Make content editable
        doc.execCommand('2D-Position', 0, 1) # This allows the user to move children 
of editable elements around

    def Ononclick(self):
        """ Called when any element on the document is clicked, used only to dispatch 
the event.
            Also remembers the last area element to be clicked."""
        self.event = event = self.doc.parentWindow.event # Get the event object
        if not event:
            try:
                self.designPanel.handleClick() # No event means that it's for the 
designPanel
            except Exception: traceback.print_exc()
        ele = event.srcElement          # Get a reference to the element that was 
clicked
        if ele and ele.id:              # Only elements with id's will be dispatched
            attrName = ele.id + 'Clicked' # Search for a method under 'self'. eg. 
'btnAddClicked'
            if hasattr(self, attrName):
                try: getattr(self, attrName)() # Call the method
                except Exception: trabceback.print_exc() # Inside the message loop, 
things just keep going!

    def Ononcontextmenu(self):
        """ Stops the popup menu for everything. Won't be reached by area element 
popups """
        # Was it our document that was clicked, or the designpanel?
        event = self.doc.parentWindow.event or self.designPanel.doc.parentWindow.event
        if event: event.returnValue = 0
        
    def btnAddClicked(self):
        """Called when btnAdd is clicked, the next click in the design panel will 
place a rectangular area there"""
        if not self.designPanel.addingRect:
            self.designPanel.addingRect = 1
            self.info.innerText = 'Adding a rectanglular area'
            self.btnAdd.style.backgroundColor = 'yellow'
        else:
            self.designPanel.addingRect = 0
            self.info.innerText = ''
            self.btnAdd.style.backgroundColor = 'ivory'

    def btnDeleteClicked(self):
        """Removes the last selected area"""
        self.designPanel.deleteSelectedArea()
        
    def btnSaveClicked(self):
        HTML = self.designPanel.doc.body.innerHTML
        f = open('test.html', 'w')
        f.write(HTML)
        f.close()


if __name__ == "__main__":
    import app
    app.main()

Reply via email to