Quickstart

Creating a Window

from wry_py import UiWindow

window = UiWindow(
    title="My App",
    width=800,
    height=600,
    background_color="#1a1a1a"
)
window.run()

Adding Content

Content is built using chained method calls. Each method returns self, and .build() produces the final element.

from wry_py import UiWindow, div, text

window = UiWindow(title="Hello World")

root = (
    div()
    .size_full()
    .v_flex()
    .items_center()
    .justify_center()
    .bg("#f0f0f0")
    .child_builder(
        text("Hello, World!")
        .text_size(32)
        .text_color("#333")
    )
    .build()
)

window.set_root(root)
window.run()

Handling Clicks

from wry_py import UiWindow, div, button

def on_click():
    print("Clicked")

window = UiWindow(title="Button Example")

root = (
    div()
    .size_full()
    .v_flex()
    .items_center()
    .justify_center()
    .child_builder(
        button("Click Me")
        .padding(15, 30)
        .bg("#007bff")
        .text_color("#fff")
        .on_click(on_click)
    )
    .build()
)

window.set_root(root)
window.run()

Updating the UI

Rebuild the element tree and call set_root() again:

from wry_py import UiWindow, div, text, button

count = 0
window = None

def increment():
    global count
    count += 1
    render()

def render():
    root = (
        div()
        .size_full()
        .v_flex()
        .items_center()
        .justify_center()
        .gap(20)
        .child_builder(text(f"Count: {count}").text_size(48))
        .child_builder(
            button("Increment")
            .padding(12, 24)
            .bg("#28a745")
            .text_color("#fff")
            .on_click(increment)
        )
        .build()
    )
    window.set_root(root)

window = UiWindow(title="Counter", width=400, height=300)
render()
window.run()

Using Classes

For larger applications, subclass AppBase to encapsulate state and rendering logic. AppBase provides helpful helpers like set_window(), set_root(), and run().

from wry_py import AppBase, UiWindow, div, text, button

class Counter(AppBase):
    def __init__(self):
        super().__init__()
        self.count = 0

    def increment(self):
        self.count += 1
        self.render()

    def decrement(self):
        self.count -= 1
        self.render()

    def render(self):
        root = (
            div()
            .size_full()
            .v_flex()
            .items_center()
            .justify_center()
            .gap(10)
            .bg("#F8FAFC")
            .child_builder(
                text(f"Count: {self.count}")
                .text_size(48)
                .text_weight("bold")
            )
            .child_builder(
                div()
                .h_flex()
                .gap(10)
                .child_builder(
                    button("-").padding(10, 20).bg("#E2E8F0").on_click(self.decrement)
                )
                .child_builder(
                    button("+").padding(10, 20).bg("#0F172A").text_color("#fff").on_click(self.increment)
                )
            )
            .build()
        )
        if self.window:
            self.window.set_root(root)

window = UiWindow(title="Counter", width=400, height=300)
app = Counter()
app.set_window(window)
app.run()