Gint Module
gint
: Wrapper for the gint library
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 *
Table of Contents
- Initialization
- Keyboard Input
- Drawing and Rendering
- Image and Font Objects
- Differences with gint’s C API
Initialization
__init__() -> None
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.
Keyboard Input
Reference headers: <gint/keyboard.h>
and <gint/keycodes.h>
.
Keyboard Constants
Key Codes (KEY_*
)
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
.
Event Types (KEYEV_*
)
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.
getkey_opt
Options (GETKEY_*
)
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
.
Keyboard Functions
The KeyEvent
object is central to keyboard input. It contains .type
, .key
, .time
, .shift
, .alpha
, .mod
, .x
, and .y
attributes.
clearevents() -> None
Discards all pending keyboard events from the input queue. Useful for ensuring that keydown()
reflects the current, real-time state.
cleareventflips() -> None
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()
getkey() -> KeyEvent
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
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!")
keydown(key: int) -> bool
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
keydown_all(keys: list[int]) -> bool
Returns True
if all keys in the list are currently pressed.
if gint.keydown_all(gint.KEY_SHIFT, gint.KEY_UP):
print("Jumping high!")
keydown_any(keys: list[int]) -> bool
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.")
keypressed(key: int) -> bool
Returns True
if the key
has transitioned from up to down since the last cleareventflips()
.
if gint.keypressed(gint.KEY_OPTN):
open_menu()
keyreleased(key: int) -> bool
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()
keycode_digit(keycode: int) -> int
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}")
keycode_function(keycode: int) -> int
Returns the number for an F-key (1
for KEY_F1
, etc.) or -1 for non-F-keys.
pollevent() -> KeyEvent
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...
Drawing and Rendering
Reference header: <gint/display.h>
.
Display and Color Constants
- 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
.
Display and Rendering Functions
C_RGB(r: int, g: int, b: int) -> int
(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
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)
dclear(color: int) -> None
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
Draws an ellipse within the bounding box defined by (x1, y1)
and (x2, y2)
.
dgetpixel(x: int, y: int) -> int
Returns the color of the pixel at (x, y)
from the VRAM. Returns -1 if out of bounds.
dhline(y: int, color: int) -> None
Draws a full-width horizontal line at y
.
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
Draws a single pixel at (x, y)
.
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
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
Draws a rectangle with an inner border of border_width
pixels.
dupdate() -> None
Transfers the VRAM content to the physical display, making drawings visible.
dvline(x: int, color: int) -> None
Draws a full-height vertical line at x
.
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
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)
dfont(font: GintFont | None) -> None
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]
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]
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]
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
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
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
Draws a gint.image
object at (x, y)
.
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)
Image Constructors
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)
Image and Font Objects
image
Object
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
.
font
Object
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
.
Differences with gint’s C API
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 abopti_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.