A declarative desktop UI framework for Rust built on GTK and Gtk-rs.
At A Glance
- A clean, functional component model inspired by the
Elm architecture, Redux and
Yew. - A declarative DSL for composing GTK widgets inspired by React and
JSX, using virtual “DOM” diffing for efficient
updates. - Fully cross platform with a native look and feel for Linux, Windows and macOS.
- Built on Rust’s
Futures using
GLib’s event loop, giving you
async/await superpowers cleanly integrated with the
GTK event model. - Absolutely no need for an embedded browser engine, unless you
really want one.
Documentation
- API docs (latest release)
- Tutorial
Show Me!

}
}
}
fn main() {
std::process::exit(run::
}”>
use vgtk::{ext::*, gtk, run, Component, UpdateAction, VNode}; use vgtk::lib::{gtk::*, gio::ApplicationFlags}; #[derive(Clone, Default, Debug)] struct Model { counter: usize, } #[derive(Clone, Debug)] enum Message { Inc, Exit, } impl Component for Model { type Message=Message; type Properties=(); fn update(&mut self, message: Message) -> UpdateActionSelf> { match message { Message::Inc => { self.counter += 1; UpdateAction::Render } Message::Exit => { vgtk::quit(); UpdateAction::None } } } fn view(&self) -> VNode{ gtk! { Application::new_unwrap(None, ApplicationFlags::empty())> Window border_width=20 on destroy=|_| Message::Exit> HeaderBar title="inc!" show_close_button=true /> Box spacing=10 halign=Align::Center> Label label=self.counter.to_string() /> Button label="inc!" image="add" always_show_image=true on clicked=|_| Message::Inc /> /Box> /Window> /Application> } } } fn main() { std::process::exit(run:: ()); }
Installation
You’ll need to ensure GTK is installed and usable on your system before you can use vgtk. Please
consult the Gtk documentation for detailed
instructions. It can be especially involved on Windows, but if you follow their instructions
carefully, it does eventually work.
Getting Started
You can use cargo generate to start a vgtk
project:
cargo generate --git https://github.com/bodil/cargo-template-vgtk
Alternatively, if you don’t want to install cargo generate, you can clone the
template repo and edit the Cargo.toml file
manually to fit your project.
To run your app, enter the project folder and type cargo run, and marvel at the little window
which eventually appears and what wonders you could fill it w
(None,>
Read More
