# Bitmaps

For some widgets you need to specify one or more bitmaps. There are several options how to do this:
  - from a bitmap file
  - from a named variable: statement var:
  - empty bitmap: statement empty:
  - from wxArtProvider: statement art:
  - from literal code: statement code:

## From Bitmap File / Path

Specify the absolute or relative path to the bitmap file.

For an absolute path, you may use the file dialog by clicking the button “…”.

You may drag a file to the field. If the file is located below the project file’s directory, the relative path will be entered. For the absolute path just hold the `Alt` or `Ctrl` key.

Sometimes, depending on your runtime environment, you may have to customize the loading of the bitmap files. See below for an example.

Example |
    /usr/share/icons/application.png
Created code C++ |
    wxBitmap("/usr/share/icons/application.png", wxBITMAP_TYPE_ANY)

## From named variable: Statement var

Syntax |
    var:<variable name>
Example |
    var:my_bitmap_path
Created code C++ |
    wxBitmap(my_bitmap_path, wxBITMAP_TYPE_ANY)

## Empty Bitmap: Statement empty

Creates an empty bitmap of the specified size (min. 1,1)

Syntax |
    empty:<width>,<height>
Example |
    empty:32,32
Created code C++ |
    wx.EmptyBitmap(32, 32)
Python |
    wxBitmap(32, 32)

## From wxArtProvider: Statement art

Create a bitmap using wxArtProvider.

See https://docs.wxpython.org/wx.ArtProvider.html for usage of wxArtProvider.

Syntax |
    art:<ArtID>,<ArtClient>
or:
    art:<ArtID>,<ArtClient>,<width>,<height>
Example |
    art:wxART_GO_UP,wxART_OTHER,32,32
Created code Perl |
    Wx::ArtProvider::GetBitmap(wxART_GO_UP, wxART_OTHER, Wx::Size->new(32, 32))

## From Code: Statement code

This just inserts the given code.

Syntax |
    code:<code chunk to return a wxBitmap>
Example |
    code:if (x == 0) get_bitmap1() else get_bitmap2();
Created code C++ |
    if (x == 0) get_bitmap1() else get_bitmap2();

## Customizing Bitmap loading

If at runtime the image files are at a non-standard location, you need to customize the loading of image files such that the files will be found.

For example, if you use PyInstaller to create a single-file executable, then the bitmaps need to be loaded from a temporary directory `sys._MEIPASS`.

This example code would replace `wx.Bitmap` with an implementation that is aware of this remapping:

    import wx
    import sys, os

    # taken from stackoverflow re accessing data files within pyinstaller bundle.
    def resource_path(relative_path):
        "Get absolute path to resource, works for dev and for PyInstaller."
        base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
        return os.path.join(base_path, relative_path)

    # get a reference to original wx.Bitmap (just in case)
    wxBitmap = wx.Bitmap

    # customised wx.Bitmap, which obtains the location of the bitmap
    # using the `resource_path` function above.
    class MyBitmap(wxBitmap):
        def __init__(self, *args, **kwargs):
            try:
                kwargs['name'] = resource_path(kwargs['name'])
            except KeyError:
                args = list(args)
                args[0] = resource_path(args[0])
            # call original wx.Bitmap
            wxBitmap.__init__(self, *args, **kwargs)

    # Remap wx.Bitmap to our customised version.
    wx.Bitmap = MyBitmap

(Courtesy of Brendan Simon)