Skip to content

Gint Module

PythonExtra is developed with the fxSDK and uses the gint kernel as a runtime. The Python module gint provides access to gint’s internal functions for rendering, keyboard, and more. Since gint has many versatile functions with good performance, it is beneficial to use it instead of e.g. casioplot or turtle.

The gint module tries to match its API with the original API of the C library, which is why few functions use keyword arguments or overloading. There are a few differences documented at the end of this document. For details not described in this document, one can refer to gint’s header files which are always applicable unless this document explicitly says otherwise.

The source for the type definitions (.pyi stubs) for this module can be found in the pythonextra-template repository.

All constants, functions, etc. discussed here are in the gint module.

import gint
# or:
from gint import *

Initializes the gint environment for graphics mode. This function is called automatically when the module is imported but can be called again to reset the state. It clears the screen to white and resets the default font.

Reference headers: <gint/keyboard.h> and <gint/keycodes.h>.

These constants represent physical keys on the calculator. KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_SHIFT, KEY_OPTN, KEY_VARS, KEY_MENU, KEY_LEFT, KEY_UP, KEY_ALPHA, KEY_SQUARE, KEY_POWER, KEY_EXIT, KEY_DOWN, KEY_RIGHT, KEY_XOT, KEY_LOG, KEY_LN, KEY_SIN, KEY_COS, KEY_TAN, KEY_FRAC, KEY_FD, KEY_LEFTP, KEY_RIGHTP, KEY_COMMA, KEY_ARROW, KEY_7, KEY_8, KEY_9, KEY_DEL, KEY_4, KEY_5, KEY_6, KEY_MUL, KEY_DIV, KEY_1, KEY_2, KEY_3, KEY_ADD, KEY_SUB, KEY_0, KEY_DOT, KEY_EXP, KEY_NEG, KEY_EXE, KEY_ACON, KEY_HELP, KEY_LIGHT, KEY_X2, KEY_CARET, KEY_SWITCH, KEY_LEFTPAR, KEY_RIGHTPAR, KEY_STORE, KEY_TIMES, KEY_PLUS, KEY_MINUS, KEY_KBD, KEY_EQUALS.

These constants describe the type of a KeyEvent.

  • KEYEV_NONE: No event.
  • KEYEV_DOWN: A key was pressed down.
  • KEYEV_UP: A key was released.
  • KEYEV_HOLD: A key is being held down (repeat event).
  • KEYEV_TOUCH_DOWN: A touch screen was pressed.
  • KEYEV_TOUCH_UP: A touch screen was released.
  • KEYEV_TOUCH_DRAG: A finger is dragging on the touch screen.

These flags are combined to configure getkey_opt. GETKEY_MOD_SHIFT, GETKEY_MOD_ALPHA, GETKEY_BACKLIGHT, GETKEY_MENU, GETKEY_REP_ARROWS, GETKEY_REP_ALL, GETKEY_REP_PROFILE, GETKEY_FEATURES, GETKEY_NONE, GETKEY_DEFAULT.

The KeyEvent object is central to keyboard input. It contains .type, .key, .time, .shift, .alpha, .mod, .x, and .y attributes.

Discards all pending keyboard events from the input queue. Useful for ensuring that keydown() reflects the current, real-time state.

Resets the tracking state for keypressed() and keyreleased(). Call this at the start of a frame before checking for single-press actions.

# Typical game loop input setup
gint.cleareventflips()
gint.clearevents()

Waits for and returns a key press or repeat event. This is a blocking function.

print("Press EXE to continue...")
ev = gint.getkey()
if ev.key == gint.KEY_EXE:
print("Continuing!")

getkey_opt(options: int, timeout_ms: int | None) -> KeyEvent

Section titled “getkey_opt(options: int, timeout_ms: int | None) -> KeyEvent”

A configurable, blocking version of getkey(). options is a sum of GETKEY_* flags. timeout_ms sets a maximum wait time; if it expires, a KEYEV_NONE event is returned.

# Wait for 2 seconds for any key, repeating all keys
opts = gint.GETKEY_DEFAULT | gint.GETKEY_REP_ALL
ev = gint.getkey_opt(opts, 2000)
if ev.type == gint.KEYEV_NONE:
print("Timeout!")

Checks if a specific key is currently held down. Returns True if pressed, False otherwise. Should be used after processing events.

# After a pollevent() loop
if gint.keydown(gint.KEY_LEFT):
player_x -= 1

Returns True if all keys in the list are currently pressed.

if gint.keydown_all(gint.KEY_SHIFT, gint.KEY_UP):
print("Jumping high!")

Returns True if any of the keys in the list are currently pressed.

if gint.keydown_any(gint.KEY_LEFT, gint.KEY_RIGHT):
print("Player is moving horizontally.")

Returns True if the key has transitioned from up to down since the last cleareventflips().

if gint.keypressed(gint.KEY_OPTN):
open_menu()

Returns True if the key has transitioned from down to up since the last cleareventflips().

if gint.keyreleased(gint.KEY_EXE):
stop_charging_power_shot()

Returns the integer value for a digit key (0 for KEY_0, etc.) or -1 for non-digit keys.

ev = gint.getkey()
digit = gint.keycode_digit(ev.key)
if digit != -1:
print(f"You pressed the number {digit}")

Returns the number for an F-key (1 for KEY_F1, etc.) or -1 for non-F-keys.

Retrieves the oldest event from the queue without waiting. If the queue is empty, returns a KEYEV_NONE event. This is the main function for non-blocking input in a game loop.

# In a game loop
while True:
ev = gint.pollevent()
if ev.type == gint.KEYEV_NONE:
break # No more events this frame
# Process event...

Reference header: <gint/display.h>.

  • Display Size: DWIDTH, DHEIGHT.
  • Colors: C_WHITE, C_BLACK, C_RED, C_GREEN, C_BLUE.
  • Operators and Transparency: C_NONE, C_INVERT.
  • Gray Mode Colors (B&W only): C_LIGHT, C_DARK, C_LIGHTEN, C_DARKEN.
  • Text Alignment: DTEXT_LEFT, DTEXT_CENTER, DTEXT_RIGHT, DTEXT_TOP, DTEXT_MIDDLE, DTEXT_BOTTOM.

(Color models only) Creates a 16-bit RGB565 color value. r, g, and b components range from 0 to 31.

my_purple = gint.C_RGB(20, 5, 31)

dcircle(x: int, y: int, r: int, fill_color: int, border_color: int) -> None

Section titled “dcircle(x: int, y: int, r: int, fill_color: int, border_color: int) -> None”

Draws a circle centered at (x, y) with radius r. fill_color and border_color can be C_NONE.

gint.dcircle(100, 100, 30, gint.C_RED, gint.C_BLACK)

Fills the entire VRAM with a single color.

gint.dclear(gint.C_WHITE)

dellipse(x1: int, y1: int, x2: int, y2: int, fill_color: int, border_color: int) -> None

Section titled “dellipse(x1: int, y1: int, x2: int, y2: int, fill_color: int, border_color: int) -> None”

Draws an ellipse within the bounding box defined by (x1, y1) and (x2, y2).

Returns the color of the pixel at (x, y) from the VRAM. Returns -1 if out of bounds.

Draws a full-width horizontal line at y.

dline(x1: int, y1: int, x2: int, y2: int, color: int) -> None

Section titled “dline(x1: int, y1: int, x2: int, y2: int, color: int) -> None”

Draws a straight line from (x1, y1) to (x2, y2).

dpixel(x: int, y: int, color: int) -> None

Section titled “dpixel(x: int, y: int, color: int) -> None”

Draws a single pixel at (x, y).

dpoly(vertices: list[int], fill_color: int, border_color: int) -> None

Section titled “dpoly(vertices: list[int], fill_color: int, border_color: int) -> None”

Draws a polygon. vertices is a flat list of coordinates [x0, y0, x1, y1, ...].

# A blue triangle with a black border
gint.dpoly([50, 10, 10, 80, 90, 80], gint.C_BLUE, gint.C_BLACK)

drect(x1: int, y1: int, x2: int, y2: int, color: int) -> None

Section titled “drect(x1: int, y1: int, x2: int, y2: int, color: int) -> None”

Draws a filled rectangle between the inclusive corners (x1, y1) and (x2, y2).

drect_border(x1, y1, x2, y2, fill_color, border_width, border_color) -> None

Section titled “drect_border(x1, y1, x2, y2, fill_color, border_width, border_color) -> None”

Draws a rectangle with an inner border of border_width pixels.

Transfers the VRAM content to the physical display, making drawings visible.

Draws a full-height vertical line at x.

dwindow_get() -> tuple[int, int, int, int]

Section titled “dwindow_get() -> tuple[int, int, int, int]”

Returns the current clipping window as (left, top, right, bottom).

dwindow_set(left: int, top: int, right: int, bottom: int) -> None

Section titled “dwindow_set(left: int, top: int, right: int, bottom: int) -> None”

Sets a clipping rectangle. All subsequent drawing operations will be confined to this area.

# Only draw in a 100x50 box at (20, 20)
gint.dwindow_set(20, 20, 120, 70)
# This line will be clipped
gint.dline(0, 45, gint.DWIDTH, 45, gint.C_BLACK)
# Restore full screen drawing
gint.dwindow_set(0, 0, gint.DWIDTH, gint.DHEIGHT)

Sets the current font for all text functions. Pass None to reset to the default font.

dsize(text: str, font: GintFont | None) -> tuple[int, int]

Section titled “dsize(text: str, font: GintFont | None) -> tuple[int, int]”

Returns the (width, height) of a string if rendered with the specified font.

tw, th = gint.dsize("Hello!", None)
print(f"Text is {tw} pixels wide and {th} pixels high.")

dnsize(text: str, size: int, font: GintFont | None) -> tuple[int, int]

Section titled “dnsize(text: str, size: int, font: GintFont | None) -> tuple[int, int]”

Like dsize, but only measures the first size bytes of the UTF-8 encoded string.

drsize(text: str, font: GintFont | None, width: int) -> tuple[int, int]

Section titled “drsize(text: str, font: GintFont | None, width: int) -> tuple[int, int]”

Calculates how much of a text fits in a given pixel width. Returns (byte_offset, actual_width).

text = "This is a very long sentence."
# How much fits in 100 pixels?
offset, used_w = gint.drsize(text, None, 100)
# This will not work correctly for multi-byte unicode
visible_part = text[:offset]
gint.dtext(10, 10, gint.C_BLACK, visible_part)

dtext(x: int, y: int, fg_color: int, text: str) -> None

Section titled “dtext(x: int, y: int, fg_color: int, text: str) -> None”

Draws text at (x, y) using the current font. This is a simplified version of dtext_opt.

dtext_opt(x, y, fg, bg, halign, valign, text, size) -> None

Section titled “dtext_opt(x, y, fg, bg, halign, valign, text, size) -> None”

Draws text with advanced alignment, an optional background color bg, and a C-level size parameter.

# Centered title
gint.dtext_opt(
gint.DWIDTH // 2, 10,
gint.C_BLACK, gint.C_NONE,
gint.DTEXT_CENTER, gint.DTEXT_TOP,
"My Game", -1
)

dimage(x: int, y: int, img: image) -> None

Section titled “dimage(x: int, y: int, img: image) -> None”

Draws a gint.image object at (x, y).

dsubimage(x, y, img, left, top, width, height) -> None

Section titled “dsubimage(x, y, img, left, top, width, height) -> None”

Draws a sub-region of an image. The (left, top, width, height) rectangle from img is drawn at (x, y).

# Draw a 16x16 tile from a spritesheet at (32, 0)
gint.dsubimage(100, 100, my_spritesheet, 32, 0, 16, 16)

These functions construct gint.image objects. They are Python-specific helpers, best used with data from fxconv.

  • image_rgb565(width, height, data)
  • image_rgb565a(width, height, data) (with 1-bit alpha)
  • image_p8_rgb565(width, height, data, palette) (256-color palette)
  • image_p8_rgb565a(width, height, data, palette) (255-color + alpha)
  • image_p4_rgb565(width, height, data, palette) (16-color palette)
  • image_p4_rgb565a(width, height, data, palette) (15-color + alpha)

Represents a graphical image. It is typically created with fxconv or one of the image_* constructors. It has the following attributes: .format, .flags, .color_count, .width, .height, .stride, .data, and .palette.

Represents a custom font. It is created with the gint.font() constructor and used with dfont(). It has many attributes reflecting its properties:

  • General: .prop, .line_height, .data_height, .block_count, .glyph_count, .char_spacing, .line_distance, .blocks, .data.
  • Monospaced-specific: .width, .storage_size.
  • Proportional-specific: .glyph_index, .glyph_width.

The Python wrapper for gint is designed to be close to the C API, but some differences exist for convenience and practicality in a Python environment.

  • Image Constructors: Functions like image_rgb565() are Python-specific helpers. In C, you would manually fill a bopti_image_t struct.
  • dfont(): The Python version does not return the previously set font.
  • dsubimage(): The flags parameter is omitted.
  • dwindow_set(): Does not return the old window settings. Use dwindow_get() first if you need to restore them.
  • Timeouts: Asynchronous volatile flags for timeouts (like in getkey_opt) are replaced with synchronous millisecond integer delays.
  • dgray(): Returns a boolean instead of an integer error code.