Top Related Projects
Read-only mirror of https://gitlab.gnome.org/GNOME/gtk
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
Cross platform GUI toolkit in Go inspired by Material Design
A cross-platform GUI library for Rust, inspired by Elm
Rust / Wasm framework for creating reliable and efficient web applications
Quick Overview
The gtk-rs/gtk
repository is a Rust binding for the GTK+ toolkit, a popular cross-platform GUI toolkit. It provides a safe and idiomatic Rust interface to the GTK+ library, allowing developers to create modern and responsive graphical user interfaces for their Rust applications.
Pros
- Cross-platform: The GTK+ toolkit is available on multiple platforms, including Linux, Windows, and macOS, allowing developers to create applications that can run on a variety of systems.
- Robust and Mature: GTK+ has been under active development for over 20 years, making it a mature and reliable toolkit with a large ecosystem of libraries and tools.
- Extensive Documentation: The
gtk-rs
project has extensive documentation, including tutorials, examples, and API references, making it easier for developers to get started and learn the library. - Active Community: The
gtk-rs
project has an active community of contributors and users, providing support, bug fixes, and new features.
Cons
- Learning Curve: The GTK+ toolkit and the
gtk-rs
bindings have a steeper learning curve compared to some other GUI frameworks, especially for developers new to Rust or GUI programming. - Dependency Management: The
gtk-rs
project has a large number of dependencies, which can make it more challenging to manage and update the project's dependencies. - Performance Overhead: The use of a binding layer between Rust and the underlying C-based GTK+ library can introduce some performance overhead, which may be a concern for certain types of applications.
- Limited Platform Support: While GTK+ is available on multiple platforms, the
gtk-rs
project may not have the same level of support or feature parity across all platforms.
Code Examples
Here are a few code examples demonstrating the usage of the gtk-rs/gtk
library:
- Creating a Window:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow};
fn main() {
let app = Application::new(Some("com.example.app"), Default::default())
.expect("Application creation failed");
app.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("My GTK App");
window.set_default_size(400, 300);
window.show_all();
});
app.run(&[]);
}
- Adding a Button:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};
fn main() {
let app = Application::new(Some("com.example.app"), Default::default())
.expect("Application creation failed");
app.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("My GTK App");
window.set_default_size(400, 300);
let button = Button::with_label("Click me!");
button.connect_clicked(|_| {
println!("Button clicked!");
});
window.add(&button);
window.show_all();
});
app.run(&[]);
}
- Using a ListBox:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, ListBox, ListBoxRow, Label};
fn main() {
let app = Application::new(Some("com.example.app"), Default::default())
.expect("Application creation failed");
app.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("My GTK App");
window.set_default_size(400, 300);
let listbox = ListBox::new();
for item in &["Item 1", "Item 2", "Item 3"] {
let row = ListBoxRow::new();
let label = Label::new(Some(item));
row.add(&label);
listbox.add(&row);
}
window.add(&listbox);
window.show_all();
});
app.run(&[]);
}
Getting Started
To get started with the `gtk-rs/
Competitor Comparisons
Read-only mirror of https://gitlab.gnome.org/GNOME/gtk
Pros of GTK
- Native C implementation, offering direct access to the GTK toolkit
- Extensive documentation and long-standing community support
- Wider range of features and more granular control over UI elements
Cons of GTK
- Steeper learning curve, especially for developers not familiar with C
- More verbose code, requiring more lines to achieve the same functionality
- Potential for memory management issues if not handled carefully
Code Comparison
GTK (C):
#include <gtk/gtk.h>
static void activate(GtkApplication* app, gpointer user_data) {
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Hello, World!");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
gtk_widget_show_all(window);
}
gtk-rs (Rust):
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow};
fn main() {
let app = Application::new(Some("com.example.app"), Default::default());
app.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("Hello, World!");
window.set_default_size(200, 200);
window.show_all();
});
app.run(&[]);
}
The gtk-rs bindings provide a more idiomatic Rust experience, with safer memory management and a more concise syntax. However, GTK offers more direct control and a broader feature set, albeit with a steeper learning curve and more verbose code.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
Pros of Tauri
- Smaller application size due to leveraging native OS components
- Cross-platform development with web technologies (HTML, CSS, JavaScript)
- Better security through Rust-based backend and limited system access
Cons of Tauri
- Less mature ecosystem compared to GTK
- Potentially slower performance for complex UI interactions
- Limited native UI components, relying more on web-based rendering
Code Comparison
Tauri (JavaScript):
import { invoke } from '@tauri-apps/api/tauri'
async function greet() {
const response = await invoke('greet', { name: 'World' })
console.log(response)
}
GTK (Rust):
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};
fn main() {
let app = Application::builder().build();
app.connect_activate(build_ui);
app.run(&[]);
}
Summary
Tauri offers a modern approach to desktop app development using web technologies, resulting in smaller app sizes and cross-platform compatibility. However, GTK provides a more mature ecosystem with native UI components and potentially better performance for complex applications. The choice between the two depends on the specific requirements of the project and the developer's familiarity with the respective technologies.
Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
Pros of Kivy
- Cross-platform support for desktop and mobile (iOS, Android)
- Python-based, making it easier for Python developers to create GUIs
- Flexible and customizable UI with its own graphics engine
Cons of Kivy
- Steeper learning curve due to its unique approach to UI design
- Less native look and feel compared to GTK-based applications
- Larger application size due to bundled dependencies
Code Comparison
Kivy:
from kivy.app import App
from kivy.uix.button import Button
class MyApp(App):
def build(self):
return Button(text='Hello World')
MyApp().run()
GTK-rs:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};
fn main() {
let app = Application::builder().build();
app.connect_activate(|app| {
let window = ApplicationWindow::builder()
.application(app)
.title("Hello World")
.build();
let button = Button::with_label("Click me!");
window.set_child(Some(&button));
window.present();
});
app.run(&[]);
}
The code examples demonstrate the simplicity of creating a basic GUI application in both frameworks. Kivy's Python-based approach is more concise, while GTK-rs offers a more structured, Rust-based implementation.
Cross platform GUI toolkit in Go inspired by Material Design
Pros of Fyne
- Cross-platform support with native look and feel
- Simpler API and easier learning curve for beginners
- Built-in material design components
Cons of Fyne
- Less mature ecosystem compared to GTK
- Fewer third-party widgets and extensions available
- Limited support for complex, custom UI layouts
Code Comparison
Fyne example:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Hello")
myWindow.SetContent(widget.NewLabel("Hello Fyne!"))
myWindow.ShowAndRun()
}
GTK example:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};
fn main() {
let app = Application::builder().build();
app.connect_activate(|app| {
let window = ApplicationWindow::builder()
.application(app)
.title("Hello")
.build();
let button = Button::with_label("Hello GTK!");
window.add(&button);
window.show_all();
});
app.run(&[]);
}
Both examples create a simple window with a label or button, showcasing the basic structure and syntax differences between Fyne and GTK.
A cross-platform GUI library for Rust, inspired by Elm
Pros of iced
- Pure Rust implementation, offering better safety and easier integration
- Designed for cross-platform development, including web applications
- More modern, reactive approach to UI development
Cons of iced
- Smaller ecosystem and community compared to GTK
- Less mature, with fewer built-in widgets and features
- Limited support for native OS look-and-feel
Code Comparison
iced example:
use iced::{button, Button, Column, Element, Sandbox, Settings, Text};
struct Counter {
value: i32,
increment_button: button::State,
decrement_button: button::State,
}
impl Sandbox for Counter {
// ... implementation details
}
gtk-rs example:
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};
fn main() {
let app = Application::builder().build();
app.connect_activate(|app| {
let window = ApplicationWindow::builder()
.application(app)
.title("My GTK App")
.build();
// ... more implementation details
});
app.run(&[]);
}
Both iced and gtk-rs provide Rust bindings for creating graphical user interfaces. iced offers a more Rust-centric approach with a focus on type safety and cross-platform development, while gtk-rs provides access to the mature and feature-rich GTK toolkit. The choice between them depends on project requirements, target platforms, and developer preferences.
Rust / Wasm framework for creating reliable and efficient web applications
Pros of Yew
- Web-based: Yew targets web applications, allowing for cross-platform deployment without native dependencies
- React-like: Familiar component-based architecture for developers with React experience
- WebAssembly: Leverages Rust's performance in the browser through WebAssembly
Cons of Yew
- Limited to web: Not suitable for native desktop applications, unlike GTK
- Ecosystem: Smaller ecosystem and fewer UI components compared to GTK's mature toolkit
Code Comparison
Yew component example:
use yew::prelude::*;
#[function_component(App)]
fn app() -> Html {
html! { <h1>{"Hello, World!"}</h1> }
}
GTK component example:
use gtk::prelude::*;
fn build_ui(app: >k::Application) {
let window = gtk::ApplicationWindow::new(app);
window.set_title("Hello, World!");
window.show_all();
}
Summary
Yew is ideal for web applications leveraging Rust's performance through WebAssembly, with a React-like component model. GTK, on the other hand, excels in creating native desktop applications with a rich set of UI components. The choice between them depends on the target platform and development preferences.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
gtk
Project site | Online documentation
Rust bindings and wrappers for GLib, GDK 3, GTK+ 3 and Cairo.
Building
gtk expects GTK+, GLib and Cairo development files to be installed on your system. See the GTK installation page.
Using
We recommend using crates from crates.io, as demonstrated here.
If you want to track the bleeding edge, use the git dependency instead:
[dependencies]
gtk = { git = "https://github.com/gtk-rs/gtk.git" }
Avoid mixing versioned and git crates like this:
# This will not compile
[dependencies]
gdk = "0.2"
gtk = { git = "https://github.com/gtk-rs/gtk.git" }
Documentation
The majority of the documentation is kept in a separate repo due to licensing issues. You can pull it in with cargo:
> cargo build --features embed-lgpl-docs
Changes to those doc-comments should be submitted to the lgpl-docs
repo. Avoid
including those embedded doc-comments in PRs to this repo.
The opposite feature removes all of those docs regardless of edits:
> cargo build --features purge-lgpl-docs
These features rewrite the crate sources so it's sufficient to enable them
once. Omitting them in the following cargo
invocations will not undo their
effects!
Generate the docs:
> cargo doc --features v3_16
(if the installed GTK+ version is lower than 3.16, adjust the feature name accordingly).
Contribute
Contributor you're welcome!
See the general bindings documentation.
Most of the bindings (src/auto
) are generated by gir using this configuration file. After editing Gir.toml
the sources can be regenerated with
> make gir
When opening a PR please put the changes to the src/auto
directory in a separate commit.
You may also wish to run cargo clippy -- -D warnings
and check that you're clean because
otherwise you may be surprised when CI fails.
License
gtk is available under the MIT License, please refer to it.
Top Related Projects
Read-only mirror of https://gitlab.gnome.org/GNOME/gtk
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
Cross platform GUI toolkit in Go inspired by Material Design
A cross-platform GUI library for Rust, inspired by Elm
Rust / Wasm framework for creating reliable and efficient web applications
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot