class_docstr: Encapsulates a list of event callbacks.
  
  Each instance of EventEmitter represents the source of a stream of similar
  events, such as mouse click events or timer activation events. For
  example, the following diagram shows the propagation of a mouse click
  event to the list of callbacks that are registered to listen for that
  event::
  
     User clicks    |Canvas creates
     mouse on       |MouseEvent:                |'mouse_press' EventEmitter:         |callbacks in sequence: # noqa
     Canvas         |                           |                                    |  # noqa
                 -->|event = MouseEvent(...) -->|Canvas.events.mouse_press(event) -->|callback1(event)  # noqa
                    |                           |                                 -->|callback2(event)  # noqa
                    |                           |                                 -->|callback3(event)  # noqa
  
  Callback functions may be added or removed from an EventEmitter using
  :func:`connect() <vispy.event.EventEmitter.connect>` or
  :func:`disconnect() <vispy.event.EventEmitter.disconnect>`.
  
  Calling an instance of EventEmitter will cause each of its callbacks
  to be invoked in sequence. All callbacks are invoked with a single
  argument which will be an instance of :class:`Event <vispy.event.Event>`.
  
  EventEmitters are generally created by an EmitterGroup instance.
  
  Parameters
  ----------
  source : object
      The object that the generated events apply to. All emitted Events will
      have their .source property set to this value.
  type : str or None
      String indicating the event type (e.g. mouse_press, key_release)
  event_class : subclass of Event
      The class of events that this emitter will generate.
class_docstr_tok: ["Encapsulates","a","list","of","event","callbacks",".","Each","instance","of","EventEmitter","represents","the","source","of","a","stream","of","similar","events",",","such","as","mouse","click","events","or","timer","activation","events",".","For","example",",","the","following","diagram","shows","the","propagation","of","a","mouse","click","event","to","the","list","of","callbacks","that","are","registered","to","listen","for","that","event",":",":","User","clicks","|Canvas","creates","mouse","on","|MouseEvent",":","|'mouse_press","'","EventEmitter",":","|callbacks","in","sequence",":","#","noqa","Canvas","|","|","|","#","noqa","--",">","|event","=","MouseEvent","(","...",")","--",">","|Canvas.events.mouse_press","(","event",")","--",">","|callback1","(","event",")","#","noqa","|","|","--",">","|callback2","(","event",")","#","noqa","|","|","--",">","|callback3","(","event",")","#","noqa","Callback","functions","may","be","added","or","removed","from","an","EventEmitter","using",":","func",":","`","connect","(",")","<","vispy.event.EventEmitter.connect",">","`","or",":","func",":","`","disconnect","(",")","<","vispy.event.EventEmitter.disconnect",">","`",".","Calling","an","instance","of","EventEmitter","will","cause","each","of","its","callbacks","to","be","invoked","in","sequence",".","All","callbacks","are","invoked","with","a","single","argument","which","will","be","an","instance","of",":","class",":","`","Event","<","vispy.event.Event",">","`",".","EventEmitters","are","generally","created","by","an","EmitterGroup","instance",".","Parameters","--","--","--","--","--","source",":","object","The","object","that","the","generated","events","apply","to",".","All","emitted","Events","will","have","their",".source","property","set","to","this","value",".","type",":","str","or","None","String","indicating","the","event","type","(","e.g",".","mouse_press",",","key_release",")","event_class",":","subclass","of","Event","The","class","of","events","that","this","emitter","will","generate","."]
docstr: Unblock this emitter. See :func:`event.EventEmitter.block`.
  
  Note: Use of ``unblock(None)`` only reverses the effect of
  ``block(None)``; it does not unblock callbacks that were explicitly
  blocked using ``block(callback)``.
docstr_tok: ["Unblock","this","emitter",".","See",":","func",":","`","event.EventEmitter.block","`",".","Note",":","Use","of","``","unblock","(","None",")","``","only","reverses","the","effect","of","``","block","(","None",")","``",";","it","does","not","unblock","callbacks","that","were","explicitly","blocked","using","``","block","(","callback",")","``","."]
code: def unblock(self, callback=None):
      """Unblock this emitter. See :func:`event.EventEmitter.block`.
  
      Note: Use of ``unblock(None)`` only reverses the effect of
      ``block(None)``; it does not unblock callbacks that were explicitly
      blocked using ``block(callback)``.
      """
      if callback not in self._blocked or self._blocked[callback] == 0:
          raise RuntimeError(
              "Cannot unblock %s for callback %s; emitter "
              "was not previously blocked." % (self, callback)
          )
      b = self._blocked[callback] - 1
      if b == 0 and callback is not None:
          del self._blocked[callback]
      else:
          self._blocked[callback] = b
  
imports: from __future__ import division
  from collections import OrderedDict
  import inspect
  import traceback
  import weakref
  from .logs import logger, _handle_exception
label_desc: Use image node_id 18 for calling the EventEmitter obj's underlying member method code with example usage: obj.unblock(callback) without return types