code: def __init__(self):
      app.Canvas.__init__(
          self,
          title="Rain [Move mouse]",
          size=(512, 512),
          keys="interactive",
      )
  
      # Build data
      # --------------------------------------
      n = 500
      self.data = np.zeros(
          n,
          [
              ("a_position", np.float32, 2),
              ("a_fg_color", np.float32, 4),
              ("a_size", np.float32),
          ],
      )
      self.index = 0
      self.program = Program(vertex, fragment)
      self.vdata = VertexBuffer(self.data)
      self.program.bind(self.vdata)
      self.program["u_antialias"] = 1.00
      self.program["u_linewidth"] = 1.00
      self.program["u_model"] = np.eye(4, dtype=np.float32)
      self.program["u_view"] = np.eye(4, dtype=np.float32)
  
      self.activate_zoom()
  
      gloo.set_clear_color("white")
      gloo.set_state(
          blend=True, blend_func=("src_alpha", "one_minus_src_alpha")
      )
      self.timer = app.Timer("auto", self.on_timer, start=True)
  
      self.show()
  
file_path: vispy/examples/demo/gloo/rain.py
imports: import numpy
  from vispy import gloo, app
  from vispy.gloo import Program, VertexBuffer
  from vispy.util.transforms import ortho
label_desc: Use image node_id 1 to create a new Canvas object from inherited base classes: app with example: obj = Canvas()