= HtmlWindow (wxHTML) Widget = `HtmlWindow` is the wxWidgets HTML display widget. It can be found in the wx.html module. It is not a full featured browser, and does not support modern html features like CSS, and certainly not JavaScript. However, it can be very useful for laying out and rendering a wide variety of documents, using a well understood markup language. It also has the wonderful special feature of being able to embed wx Widgets in an html page. == HtmlWindow and Form tags == `HtmlWindow` has no form support, but it can be extended with custom tag handlers. Download this attachment for a sample package implementing support for HTML forms. [[attachment:forms.zip]] == Embedding Images in HtmlWindow == `HtmlWindow` can display inline images in the usual way, by providing a url to the image. However, if you want to be able to use `HtmlWindow` to display a page with some images, but don't want to have to have the image files on the file system, there are a couple ways to embed images that you have in memory, and can be loaded from python code (or gotten into memory any other way). The following example demonstrates two ways: * Using `HtmlWindow`'s ability to show a wx widget on the page, and embedding a `wxStaticBitmap`. `HtmlWindow` is expecting to instantiate the class, and there is no way to pass a wx.Bitmap into the constructor, so you need a custom class. If you want to do something more fancy, you can creating new tag handler. * Using `wx.MemoryFSHandler()`. `HtmlWindow` uses `wx.FileSystem` as an abstraction of the file system to load resources. You can add a MemoryFSHandler to it, and put whatever you want in there. I think this is the cleanest way to do it, and the html is then pretty standard. '''Note:''' in the below code, the html refers to the name of the module that the "Bitmap1" class is defined, which is this file, so you need to name it `ImageInHtml.py` in order for it to work. {{{ #!/usr/bin/env python import wx import wx.lib.wxpTag # The html page as a python string literal page = r"""

Embedding an Image in wxHTML

As a wx.StaticBitmap:

Using a MemoryFSHandler:

""" class Bitmap1(wx.StaticBitmap): """ A custom StaticBitmap class that holds your image. """ def __init__(self, *args, **kwargs): """ The __init__ is called by the HtmlWindow, it takes all the usual wx.Window parameters, then the custom bitmap is added to the key word arguments. """ bmp = smalltest.GetBitmap() kwargs['bitmap'] = bmp wx.StaticBitmap.__init__(self, *args, **kwargs) class DemoFrame(wx.Frame): """ This window displays a HtmlWindow """ def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) htmlwin = wx.html.HtmlWindow(self) htmlwin.SetPage(page) class MyApp(wx.App): """ A little test wx.App """ def OnInit(self): # add the image to the MemoryFileSystem: mfs = wx.MemoryFSHandler() wx.FileSystem_AddHandler(mfs) mfs.AddFile("smalltest.png", smalltest.GetImage(), wx.BITMAP_TYPE_PNG) # Initializing the Frame frame = DemoFrame(None, title="HTML Tester Window", size = (500,500)) self.SetTopWindow(frame) frame.Show(True) return True ## This is the image data itself, created with the img2py utility that ## ships with wxPython from wx.lib.embeddedimage import PyEmbeddedImage smalltest = PyEmbeddedImage( "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") if __name__ == "__main__" : app = MyApp(0) app.MainLoop() }}}