The ocempgui.access
module provides a
wrapper around the ATK accessibility library and several classes
to ease the development of accessible applications. To serve
different ability ranges, objects can be aware, the ATK
developers use an C interface system, that has to be implemented
for each toolkit. OcempGUI implements those interfaces using the
AtkObject
only and flags, that will
enable or disable certain interfaces within that instance.
To use accessibility features in your code, you have to import the module using:
import ocempgui.access
import ocempgui.access.papi
To make python objects accessible and usable by
accessibility-aware applications and hardware they should
implement IAccessible
interface
class. It provides a single method interface,
get_accessible()
, which has to return
an AtkObject
object for the specific
python instances.
class A11yObject (IAccessible): def __init__ (self): IAccessible.__init__ (self) ... def get_accessible (self): obj = AtkObject (...) ... return obj
Dependant on the capabilities of the python object and the
information it provides, it has to set up several attributes
and/or implement various interfaces of the
AtkObject
, which will be returned.
TODO: provide more details
You can find the following example as a python script
under examples/a11y_test.py
.
# papi test example. import ocempgui.access.papi as papi import atexit # Main object - somewhat similar to the GailTopLevel object. application = papi.AtkObject () application.name = "Application object" application.description = "Application description" application.role = papi.ATK_ROLE_APPLICATION application.parent = None def get_application (): global application return application # Register the interfaces and initialize the atk-bridge. papi.set_atk_root (get_application) atexit.register (papi.shutdown) papi.init () class SimpleA11y (papi.AtkObject): def __init__ (self): ifaces = papi.ATK_IFACE_COMPONENT | papi.ATK_IFACE_ACTION papi.AtkObject.__init__ (self, ifaces) # Implement some interfaces of ATK_IFACE_ACTION and # ATK_IFACE_COMPONENT. self.action_get_n_actions = self.__get_n_actions self.action_get_description = self.__get_description self.action_get_name = self.__get_name self.component_get_extents = self.__get_pos def __get_pos (self, coords): return 10, 10, 99, 99 def __get_n_actions (self): return 1 def __get_description (self, i): return "Example action." def __get_name (self, i): return "Example action name" # Window dummy as child of the toplevel application object. window = SimpleA11y () # Retrieve the state set, so we can set it active. set = window.ref_state_set () set.add_state (papi.ATK_STATE_ACTIVE) # Set some necessary information for accessibility applications. window.role = papi.ATK_ROLE_WINDOW window.name = "Window A11y Object" window.description = "Window Description" # Link it with the application object window.parent = application # Signal testing - window:create will cause accessibility applications # to note, that a new window was created for the application. window.emit ("window:create") print "Keeping myself alive. Press CTRL-C to exit the application." while True: # Iterate the main processing loop of the ATK wrapper internals, # so that external applications can interact with the objects. papi.iterate ()
Example 1. ocempgui.access.papi test example
The Magnifier
class of the
ocempgui.access
module is a screen
magnification tool for pygame screens. It allows users to zoom
portions of the current pygame screen, which are determined by
the mouse cursor position. It allows different magnification
factors and a variable sizing of the area to zoom.
The Magnifier
can be integrated easily
into any pygame mainloop and adjusted with minimal effort. To
create a new instance of it, you simply can invoke its
constructor with no arguments.
magnifier = Magnifier ()
# Use a magnification area of 100, 100 and a factor of 3. magnifier = Magnifier (100, 100, 3)
The zoom factor can be adjusted using the
factor attribute and
set_factor()
method.
magnifier.factor = 5.2 magnifier.set_factor (0.5)
Values smaller than 1 will zoom out the affected area.
The size of the area around the mouse cursor, which should be
magnified, can be adjusted using the size
attribute and set_size()
method.
magnifier.size = 50, 50 magnifier.set_size (40, 70)
Integrating the Magnifier
in a pygame
application is done by just adding one or two lines of code.
The most important line is to notify it about the available
pygame events.
while True: events = pygame.event.get () magnifier.notify (*events) ...
pygame.MOUSEMOTION
events. Any other event
will cause it to update its area only.
The update is done only once per
notify()
invocation. If multiple
pygame.MOUSEMOTION
events are in the
passed list, only the last on will be used for repositioning.
If the pygame display is manipulated directly and thus needs to
contain its original surface information (without the magnified
area), the restore()
method should be
invoked before the manipulation occurs.
while True: events = pygame.event.get () magnifier.restore () # Display manipulation .... magnifier.notify (*events) ...
Magnifier
will be suspended) before
any manipulation takes place. Afterwards the
Magnifier
will be enabled again by
passing the current events to it.
The Magnifier
allows you to setup your
own zoom function for best results when zooming parts of your
application screen. The zoom_func attribute
and set_zoom_func()
method allow you to
provide an own zoom function, which has to return the zoomed
surface. It receives additional arguments, which are explained
in detail in the inline documentation of the
Magnifier
class.
Implementing the Magnifier
's default zoom
function could be achieved using the following code.
def own_zoom_func (screen, mousepos, resultsize, size, factor): offset = mousepos[0] - size[0] / 2, mousepos[1] - size[1] / 2 # Create zoomable surface. surface = pygame.Surface ((size[0], size[1])) surface.blit (screen, (0, 0), (offset[0], offset[1], size[0], size[1])) # Zoom and blit. return pygame.transform.scale (surface, (resultsize[0], resultsize[1])) # Assign the new zoom function. magnifier.zoom_func = own_zoom_func