Note
Go to the end to download the full example code.
Card#
This example shows how to create a card and use a sprite sheet to update the image in the card.
First, some imports.
import fury
import os
from tempfile import TemporaryDirectory as InTemporaryDirectory
from fury.data import fetch_viz_icons
from fury.io import load_image, load_sprite_sheet, save_image
First we need to fetch some icons that are included in FURY.
TARGET_FPS = 15
FRAME_TIME = (1.0 / TARGET_FPS) * 1000
fetch_viz_icons()
sprite_sheet = load_sprite_sheet(
    "https://raw.githubusercontent.com/fury-gl/"
    "fury-data/master/unittests/fury_sprite.png",
    5,
    5,
)
CURRENT_SPRITE_IDX = 0
vtk_sprites = []
Let’s create a card and add it to the show manager
img_url = (
    "https://raw.githubusercontent.com/fury-gl"
    "/fury-communication-assets/main/fury-logo.png"
)
title = "FURY"
body = (
    "FURY - Free Unified Rendering in pYthon."
    "A software library for scientific visualization in Python."
)
card = fury.ui.elements.Card2D(
    image_path=img_url,
    title_text=title,
    body_text=body,
    image_scale=0.55,
    size=(300, 300),
    bg_color=(1, 0.294, 0.180),
    bg_opacity=0.8,
    border_width=5,
    border_color=(0.1, 0.4, 0.8),
)
Now we define the callback to update the image on card after some delay.
def timer_callback(_obj, _evt):
    global CURRENT_SPRITE_IDX, show_manager
    CURRENT_SPRITE_IDX += 1
    sprite = vtk_sprites[CURRENT_SPRITE_IDX % len(vtk_sprites)]
    card.image.set_img(sprite)
    i_ren = show_manager.scene.GetRenderWindow().GetInteractor().GetInteractorStyle()
    i_ren.force_render()
Lets create a function to convert the sprite to vtkImageData
def sprite_to_vtk():
    with InTemporaryDirectory() as tdir:
        for idx, sprite in enumerate(list(sprite_sheet.values())):
            sprite_path = os.path.join(tdir, f"{idx}.png")
            save_image(sprite, sprite_path, compression_quality=100)
            vtk_sprite = load_image(sprite_path, as_vtktype=True)
            vtk_sprites.append(vtk_sprite)
Now that the card has been initialised, we add it to the show manager.
current_size = (1000, 1000)
show_manager = fury.window.ShowManager(size=current_size, title="FURY Card Example")
show_manager.scene.add(card)
show_manager.initialize()
Converting numpy array sprites to vtk images
sprite_to_vtk()
Adding a timer to update the card image
show_manager.add_timer_callback(True, int(FRAME_TIME), timer_callback)
# To interact with the UI, set interactive = True
interactive = False
if interactive:
    show_manager.start()
fury.window.record(scene=show_manager.scene, out_path="card_ui.png", size=(1000, 1000))