Skip to content

Complete GUI Examples

Comprehensive GUI application examples.

Hello GUI

The simplest possible GUI app:

gui_init("com.example.hello");
let window = gui_window("Hello GUI", 300, 200);
let label = gui_label("Hello, World!");
gui_add(window, label);
gui_run();

Interactive Greeting

gui_init("com.example.greet");

let window = gui_window("Greeting App", 400, 200);
let box = gui_box("vertical", 10);

let label1 = gui_label("Enter your name:");
let entry = gui_entry("Name");
let button = gui_button("Greet");
let result = gui_label("");

fn greet() {
    let name = gui_get_text(entry);
    let message = "Hello, #{name}!";
    gui_set_text(result, message);
}

gui_on(button, "clicked", "greet");

gui_add(box, label1);
gui_add(box, entry);
gui_add(box, button);
gui_add(box, result);
gui_add(window, box);

gui_run();

Counter with Reset

gui_init("com.example.counter");

let window = gui_window("Counter", 300, 200);
let box = gui_box("vertical", 10);

let display = gui_label("Count: 0");
let button_row = gui_box("horizontal", 5);
let btn_inc = gui_button("+");
let btn_dec = gui_button("-");
let btn_reset = gui_button("Reset");

let count = 0;

fn increment() {
    count = count + 1;
    gui_set_text(display, "Count: #{count}");
}

fn decrement() {
    count = count - 1;
    gui_set_text(display, "Count: #{count}");
}

fn reset() {
    count = 0;
    gui_set_text(display, "Count: 0");
}

gui_on(btn_inc, "clicked", "increment");
gui_on(btn_dec, "clicked", "decrement");
gui_on(btn_reset, "clicked", "reset");

gui_add(button_row, btn_inc);
gui_add(button_row, btn_dec);
gui_add(button_row, btn_reset);

gui_add(box, display);
gui_add(box, button_row);
gui_add(window, box);

gui_run();

Temperature Converter

gui_init("com.example.tempconv");

let window = gui_window("Temperature Converter", 400, 250);
let box = gui_box("vertical", 10);

// Celsius to Fahrenheit
let c_frame = gui_frame("Celsius to Fahrenheit");
let c_box = gui_box("horizontal", 5);
let c_entry = gui_entry("0");
let c_button = gui_button("Convert");
let c_result = gui_label("= 32°F");

gui_add(c_box, c_entry);
gui_add(c_box, c_button);
gui_add(c_box, c_result);
gui_add(c_frame, c_box);

// Fahrenheit to Celsius
let f_frame = gui_frame("Fahrenheit to Celsius");
let f_box = gui_box("horizontal", 5);
let f_entry = gui_entry("32");
let f_button = gui_button("Convert");
let f_result = gui_label("= 0°C");

gui_add(f_box, f_entry);
gui_add(f_box, f_button);
gui_add(f_box, f_result);
gui_add(f_frame, f_box);

fn convert_c_to_f() {
    let c = float(gui_get_text(c_entry));
    let f = (c * 9 / 5) + 32;
    gui_set_text(c_result, "= #{f}°F");
}

fn convert_f_to_c() {
    let f = float(gui_get_text(f_entry));
    let c = (f - 32) * 5 / 9;
    gui_set_text(f_result, "= #{c}°C");
}

gui_on(c_button, "clicked", "convert_c_to_f");
gui_on(f_button, "clicked", "convert_f_to_c");

gui_add(box, c_frame);
gui_add(box, f_frame);
gui_add(window, box);

gui_run();

Note Taking App

gui_init("com.example.notes");

let window = gui_window("Notes", 500, 400);
let box = gui_box("vertical", 5);

// Toolbar
let toolbar = gui_box("horizontal", 5);
let btn_new = gui_button("New");
let btn_save = gui_button("Save");
let btn_load = gui_button("Load");
let entry_filename = gui_entry("note.txt");

gui_add(toolbar, btn_new);
gui_add(toolbar, btn_save);
gui_add(toolbar, btn_load);
gui_add(toolbar, entry_filename);

// Text area
let textview = gui_textview();

// Status bar
let status = gui_label("Ready");

fn new_note() {
    gui_set_text(textview, "");
    gui_set_text(status, "New note created");
}

fn save_note() {
    let filename = gui_get_text(entry_filename);
    let content = gui_get_text(textview);
    write_file(filename, content);
    gui_set_text(status, "Saved to #{filename}");
}

fn load_note() {
    let filename = gui_get_text(entry_filename);
    if file_exists(filename) == true {
        let content = read_file(filename);
        gui_set_text(textview, content);
        gui_set_text(status, "Loaded #{filename}");
    } else {
        gui_set_text(status, "File not found!");
    }
}

gui_on(btn_new, "clicked", "new_note");
gui_on(btn_save, "clicked", "save_note");
gui_on(btn_load, "clicked", "load_note");

gui_add(box, toolbar);
gui_add(box, textview);
gui_add(box, status);
gui_add(window, box);

gui_run();

Login Form

gui_init("com.example.login");

let window = gui_window("Login", 350, 250);
let box = gui_box("vertical", 10);

let title = gui_label("Please Login");

let user_box = gui_box("horizontal", 5);
let user_label = gui_label("Username:");
let user_entry = gui_entry("username");
gui_add(user_box, user_label);
gui_add(user_box, user_entry);

let pass_box = gui_box("horizontal", 5);
let pass_label = gui_label("Password:");
let pass_entry = gui_entry("password");
gui_add(pass_box, pass_label);
gui_add(pass_box, pass_entry);

let remember_check = gui_checkbox("Remember me");

let button_box = gui_box("horizontal", 5);
let btn_login = gui_button("Login");
let btn_cancel = gui_button("Cancel");
gui_add(button_box, btn_login);
gui_add(button_box, btn_cancel);

let status = gui_label("");

fn attempt_login() {
    let username = gui_get_text(user_entry);
    let password = gui_get_text(pass_entry);
    let remember = gui_get_checked(remember_check);

    // Simple validation (not real authentication!)
    if len(username) < 3 {
        gui_set_text(status, "Username too short");
    } else {
        if len(password) < 4 {
            gui_set_text(status, "Password too short");
        } else {
            let msg = "Login successful!";
            if remember == true {
                msg = msg + " (Remembered)";
            }
            gui_set_text(status, msg);
        }
    }
}

fn cancel_login() {
    gui_set_text(user_entry, "");
    gui_set_text(pass_entry, "");
    gui_set_checked(remember_check, false);
    gui_set_text(status, "Cancelled");
}

gui_on(btn_login, "clicked", "attempt_login");
gui_on(btn_cancel, "clicked", "cancel_login");

gui_add(box, title);
gui_add(box, user_box);
gui_add(box, pass_box);
gui_add(box, remember_check);
gui_add(box, button_box);
gui_add(box, status);

gui_add(window, box);

gui_run();

Settings Panel

gui_init("com.example.settings");

let window = gui_window("Settings", 400, 300);
let main_box = gui_box("vertical", 10);

// General Settings
let general_frame = gui_frame("General");
let general_box = gui_box("vertical", 5);
let check_auto_save = gui_checkbox("Auto-save");
let check_notifications = gui_checkbox("Enable notifications");
gui_set_checked(check_auto_save, true);
gui_add(general_box, check_auto_save);
gui_add(general_box, check_notifications);
gui_add(general_frame, general_box);

// Appearance
let appearance_frame = gui_frame("Appearance");
let appearance_box = gui_box("vertical", 5);
let check_dark_mode = gui_checkbox("Dark mode");
let check_animations = gui_checkbox("Enable animations");
gui_set_checked(check_animations, true);
gui_add(appearance_box, check_dark_mode);
gui_add(appearance_box, check_animations);
gui_add(appearance_frame, appearance_box);

// Buttons
let button_box = gui_box("horizontal", 5);
let btn_save = gui_button("Save");
let btn_reset = gui_button("Reset");
let btn_cancel = gui_button("Cancel");

fn save_settings() {
    let settings = "";
    settings = settings + "auto_save=#{gui_get_checked(check_auto_save)}\n";
    settings = settings + "notifications=#{gui_get_checked(check_notifications)}\n";
    settings = settings + "dark_mode=#{gui_get_checked(check_dark_mode)}\n";
    settings = settings + "animations=#{gui_get_checked(check_animations)}\n";

    write_file("settings.txt", settings);
    print "Settings saved!";
}

fn reset_settings() {
    gui_set_checked(check_auto_save, true);
    gui_set_checked(check_notifications, false);
    gui_set_checked(check_dark_mode, false);
    gui_set_checked(check_animations, true);
    print "Settings reset to defaults";
}

gui_on(btn_save, "clicked", "save_settings");
gui_on(btn_reset, "clicked", "reset_settings");

gui_add(button_box, btn_save);
gui_add(button_box, btn_reset);
gui_add(button_box, btn_cancel);

gui_add(main_box, general_frame);
gui_add(main_box, appearance_frame);
gui_add(main_box, button_box);

gui_add(window, main_box);

gui_run();

Tips for Building GUI Apps

1. Start with Layout

Plan your layout before coding: - Sketch the UI on paper - Decide on vertical/horizontal boxes - Group related widgets

2. Use Meaningful IDs

let btn_submit = gui_button("Submit", "btn_submit");
let entry_email = gui_entry("email", "entry_email");

3. Organize Code

// ===== WIDGETS =====
let window = gui_window(...);
let box = gui_box(...);

// ===== CALLBACKS =====
fn on_save() { ... }
fn on_cancel() { ... }

// ===== LAYOUT =====
gui_add(box, widget1);
gui_add(box, widget2);

// ===== RUN =====
gui_run();

4. Test Incrementally

Build one feature at a time and test after each addition.

5. Handle Edge Cases

fn save() {
    let text = gui_get_text(entry);
    if len(text) == 0 {
        gui_set_text(status, "Error: Empty input");
        return 0;
    }
    // Process...
}

Compiling GUI Apps

# Compile
./choco compile myapp.choco -o myapp

# Run
./myapp

Your GUI app is now a standalone executable!