323 个版本 (130 个稳定版本)

1.4.33 2024年7月30日
1.4.30 2024年5月8日
1.4.27 2024年3月31日
1.4.21 2023年12月30日
0.1.22 2020年3月31日

#22 in GUI

Download history 722/week @ 2024-05-04 508/week @ 2024-05-11 696/week @ 2024-05-18 683/week @ 2024-05-25 1019/week @ 2024-06-01 669/week @ 2024-06-08 972/week @ 2024-06-15 761/week @ 2024-06-22 387/week @ 2024-06-29 384/week @ 2024-07-06 499/week @ 2024-07-13 681/week @ 2024-07-20 982/week @ 2024-07-27 466/week @ 2024-08-03 594/week @ 2024-08-10 380/week @ 2024-08-17

2,560 每月下载次数
用于 53 个 Crates (52 个直接使用)

MIT 许可证

12MB
274K SLoC

C++ 145K SLoC // 0.2% comments C 62K SLoC // 0.2% comments Rust 61K SLoC // 0.0% comments Objective-C++ 6K SLoC // 0.1% comments Shell 338 SLoC // 0.2% comments Objective-C 32 SLoC

fltk-rs

Documentation Crates.io License Build

Rust 对 FLTK 图形用户界面库的绑定。

fltk crate 是一个跨平台的轻量级 GUI 库,可以静态链接以产生小型、自包含且快速的 GUI 应用程序。

资源

为什么选择 FLTK?

  • 轻量级。二进制文件小,去重后约 1MB。 小内存占用
  • 速度。安装快,构建快,启动快,运行快。
  • 单个可执行文件。无需部署 DLL。
  • 支持旧架构。
  • FLTK 的宽松许可协议,允许对封闭源代码应用程序进行静态链接。
  • 可主题化(支持 5 种方案:Base、GTK、Plastic、Gleam 和 Oxy),以及使用 fltk-theme 进行额外的主题化。
  • 提供约 80 个可自定义的小部件。
  • 内置图像支持。

这是一个使用 FLTK 的软件 列表。对于使用 fltk-rs 的软件,请查看 这里

用法

只需将以下内容添加到您项目的 Cargo.toml 文件中

[dependencies]
fltk = "^1.4"

要使用仓库中的最新更改

[dependencies]
fltk = { version = "^1.4", git = "https://github.com/fltk-rs/fltk-rs" }

如果您有其他依赖于 fltk-rs 的依赖项

[dependencies]
fltk = "^1.4"

[patch.crates-io]
fltk = { git = "https://github.com/fltk-rs/fltk-rs" }

要使用捆绑的库(适用于 x64 Windows (msvc & gnu (msys2-mingw))、x64 & aarch64 Linux & macOS)

[dependencies]
fltk = { version = "^1.4", features = ["fltk-bundled"] }

库会自动构建并静态链接到您的二进制文件。

一个示例“Hello World”应用程序

use fltk::{app, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    wind.end();
    wind.show();
    app.run().unwrap();
}

另一个示例展示基本回调功能

use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    let mut frame = Frame::new(0, 0, 400, 200, "");
    let mut but = Button::new(160, 210, 80, 40, "Click me!");
    wind.end();
    wind.show();
    but.set_callback(move |_| frame.set_label("Hello World!")); // the closure capture is mutable borrow to our button
    app.run().unwrap();
}

请检查 示例目录 以获取更多示例。您会注意到所有小部件都是通过 new() 方法实例化的,该方法接受 x 和 y 坐标、小部件的宽度和高度,以及一个标签,如果需要可以留空。初始化小部件的另一种方法是使用构建器模式:(以下按钮是等效的)

use fltk::{button::Button, prelude::*};
let but1 = Button::new(10, 10, 80, 40, "Button 1");

let but2 = Button::default()
    .with_pos(10, 10)
    .with_size(80, 40)
    .with_label("Button 2");

这是使用构建器模式的一个计数器示例

use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
fn main() {
    let app = app::App::default();
    let mut wind = Window::default()
        .with_size(160, 200)
        .center_screen()
        .with_label("Counter");
    let mut frame = Frame::default()
        .with_size(100, 40)
        .center_of(&wind)
        .with_label("0");
    let mut but_inc = Button::default()
        .size_of(&frame)
        .above_of(&frame, 0)
        .with_label("+");
    let mut but_dec = Button::default()
        .size_of(&frame)
        .below_of(&frame, 0)
        .with_label("-");
    wind.make_resizable(true);
    wind.end();
    wind.show();
    /* Event handling */
    app.run().unwrap();
}

或者,您可以使用 Flex(用于弹性布局)、Pack 或 Grid

use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};
fn main() {
    let app = app::App::default();
    let mut wind = Window::default().with_size(160, 200).with_label("Counter");
    let mut flex = Flex::default().with_size(120, 140).center_of_parent().column();
    let mut but_inc = Button::default().with_label("+");
    let mut frame = Frame::default().with_label("0");
    let mut but_dec = Button::default().with_label("-");
    flex.end();
    wind.end();
    wind.show();
    app.run().unwrap();
}

另一个示例

use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::default().with_size(400, 300);
    let mut col = Flex::default_fill().column();
    col.set_margins(120, 80, 120, 80);
    let mut frame = Frame::default();
    let mut but = Button::default().with_label("Click me!");
    col.fixed(&but, 40);
    col.end();
    wind.end();
    wind.show();

    but.set_callback(move |_| frame.set_label("Hello world"));

    app.run().unwrap();
}

事件

可以使用 set_callback 方法(如上所示)或可用的 fltk::app::set_callback() 自由函数来处理事件,它将处理每个小部件的默认触发器(如按钮的点击)

    /* previous hello world code */
    but.set_callback(move |_| frame.set_label("Hello World!"));
    another_but.set_callback(|this_button| this_button.set_label("Works"));
    app.run().unwrap();

另一种方法是使用消息传递

    /* previous counter code */
    let (s, r) = app::channel::<Message>();

    but_inc.emit(s, Message::Increment);
    but_dec.emit(s, Message::Decrement);
    
    while app.wait() {
        let label: i32 = frame.label().parse().unwrap();
        if let Some(msg) = r.recv() {
            match msg {
                Message::Increment => frame.set_label(&(label + 1).to_string()),
                Message::Decrement => frame.set_label(&(label - 1).to_string()),
            }
        }
    }

对于代码的其余部分,请查看完整的示例 此处

对于自定义事件处理,可以使用 handle() 方法

    some_widget.handle(move |widget, ev: Event| {
        match ev {
            Event::Push => {
                println!("Pushed!");
                true
            },
            /* other events to be handled */
            _ => false,
        }
    });

使用 handle 方法处理或忽略的事件应返回 true,未处理的事件应返回 false。更多示例可在 fltk/examples 目录中找到。

对于使用即时模式方法的事件处理机制,请查看 fltk-evented crate

主题

FLTK 提供了 5 种应用程序方案

  • 基础
  • Gtk
  • Gleam
  • 塑料
  • Oxy

(额外的主题可以在 fltk-theme crate 中找到)

这些可以通过 App::with_scheme() 方法设置。

let app = app::App::default().with_scheme(app::Scheme::Gleam);

可以使用 WidgetExt trait 中提供的方法可选地修改单个小部件的主题,例如 set_color()set_label_font()set_frame()

    some_button.set_color(Color::Light1); // You can use one of the provided colors in the fltk enums
    some_button.set_color(Color::from_rgb(255, 0, 0)); // Or you can specify a color by rgb or hex/u32 value
    some_button.set_color(Color::from_u32(0xffebee));
    some_button.set_frame(FrameType::RoundUpBox);
    some_button.set_font(Font::TimesItalic);

对于默认应用程序颜色,fltk-rs 提供了 app::background()app::background2()app::foreground()。您还可以指定默认应用程序选择/非活动颜色、字体、标签大小、框架类型、滚动条大小、菜单行间距。此外,fltk-theme crate 还提供了一些其他预定义的颜色映射(深色主题、浅色等)和可以加载到您的应用程序中的小部件主题。

构建依赖项

Rust(版本 > 1.63)、CMake(版本 > 3.15)、Git 和一个 C++17 编译器需要安装并位于您的 PATH 中,以从源代码进行跨平台构建。推荐使用 Ninja,但不是必需的。此 crate 还为选定的 x86_64 和 aarch64 平台提供捆绑形式的 fltk(Windows(msvc 和 gnu)、MacOS、Linux),这可以通过使用在用法部分中提到的 fltk-bundled 功能标志启用(这需要 curl 和 tar 下载和解压捆绑库)。

  • Windows
    • MSVC:Windows SDK
    • Gnu:无依赖
  • MacOS:无依赖。
  • Linux/BSD:开发需要安装X11和OpenGL的开发头文件。库本身通常在带有图形用户界面的linux/bsd发行版中可用。

对于基于Debian的GUI发行版,这意味着运行

sudo apt-get install libx11-dev libxext-dev libxft-dev libxinerama-dev libxcursor-dev libxrender-dev libxfixes-dev libpango1.0-dev libgl1-mesa-dev libglu1-mesa-dev

对于基于RHEL的GUI发行版,这意味着运行

sudo yum groupinstall "X Software Development" && sudo yum install pango-devel libXinerama-devel libstdc++-static

对于基于Arch的GUI发行版,这意味着运行

sudo pacman -S libx11 libxext libxft libxinerama libxcursor libxrender libxfixes pango cairo libgl mesa --needed

对于Alpine Linux

apk add pango-dev fontconfig-dev libxinerama-dev libxfixes-dev libxcursor-dev mesa-gl

对于NixOS(Linux发行版),可以使用此nix-shell环境

nix-shell --packages rustc cmake git gcc xorg.libXext xorg.libXft xorg.libXinerama xorg.libXcursor xorg.libXrender xorg.libXfixes libcerf pango cairo libGL mesa pkg-config

运行时依赖

  • Windows:无
  • MacOS:无
  • Linux:您需要X11库,以及用于绘图的pango和cairo(如果您想启用enable-glwindow功能,还需要OpenGL)
apt-get install -qq --no-install-recommends libx11-6 libxinerama1 libxft2 libxext6 libxcursor1 libxrender1 libxfixes3 libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libpangoxft-1.0-0 libglib2.0-0 libfontconfig1 libglu1-mesa libgl1

请注意,如果您已安装构建依赖项,它还将自动安装运行时依赖项。

请注意,大多数图形桌面环境已经预装了这些库。此列表在您想测试在CI/docker中已构建的包(其中没有图形用户界面)时可能很有用。

功能

以下是由该crate提供的功能

  • use-ninja:如果可用,则使用ninja构建系统以实现更快的构建,特别是在Windows上。
  • no-pango:在Linux/BSD上构建时不支持pango,如果不需要rtl/cjk字体支持。
  • fltk-bundled:在选定平台上支持cfltk和fltk的捆绑版本(需要curl和tar)
  • enable-glwindow:支持使用OpenGL函数进行绘制。
  • system-libpng:使用系统libpng
  • system-libjpeg:使用系统libjpeg
  • system-zlib:使用系统zlib
  • use-wayland:使用FLTK的wayland混合后端(在存在wayland时在wayland上运行,在不存在时在X11上运行)。除了X11开发包外,还需要libwayland-dev、wayland-protocols、libdbus-1-dev、libxkbcommon-dev、libgtk-3-dev(可选,用于GTK样式标题栏)。示例CI
  • fltk-config:使用已安装的FLTK的fltk-config构建此crate。这仍然需要FLTK 1.4。这有助于减少构建时间,对本地构建的FLTK进行测试,并且不需要调用git或cmake。

常见问题解答

请查看常见问题解答页面,了解常见问题、遇到的错误、部署指南和贡献说明。

构建

要构建,只需运行

git clone https://github.com/fltk-rs/fltk-rs --recurse-submodules
cd fltk-rs
cargo build

当前实现的数据类型

图像类型

  • SharedImage
  • BmpImage
  • JpegImage
  • GifImage
  • AnimGifImage
  • PngImage
  • SvgImage
  • Pixmap
  • RgbImage
  • XpmImage
  • XbmImage
  • PnmImage
  • TiledImage

小部件

  • 按钮
    • Button
    • RadioButton
    • ToggleButton
    • RoundButton
    • CheckButton
    • LightButton
    • RepeatButton
    • RadioLightButton
    • RadioRoundButton
    • ReturnButton
    • ShortcutButton
  • 对话框
    • 本地文件对话框
    • 文件选择器
    • 帮助对话框
    • 消息对话框
    • 警告对话框
    • 密码对话框
    • 选择对话框
    • 输入对话框
    • 颜色选择器对话框
  • 框架(Fl_Box)
  • Windows
    • 窗口
    • SingleWindow(单缓冲区)
    • DoubleWindow(双缓冲区)
    • MenuWindow
    • OverlayWindow
    • GlWindow(需要“enable-glwindow”标志)
    • 实验性GlWidgetWindow(需要“enable-glwindow”标志)
  • 分组
  • 文本显示小部件
    • TextDisplay
    • TextEditor
    • SimpleTerminal
  • 输入小部件
    • Input
    • IntInput
    • FloatInput
    • MultilineInput
    • SecretInput
    • FileInput
  • 输出小部件
    • Output
    • 多行输出
  • 菜单小部件
    • MenuBar
    • MenuItem
    • 选择(下拉列表)
    • SysMenuBar(出现在屏幕顶部的MacOS菜单栏)
  • 值调节小部件
    • 滑动条
    • NiceSlider
    • 值滑动条
    • 旋钮
    • 线性旋钮
    • 计数器
    • 滚动条
    • 滚轮
    • 调节器
    • 值输入
    • 值输出
    • 填充滑动条
    • 填充旋钮
    • HorSlider(水平滑动条)
    • HorFillSlider
    • HorNiceSlider
    • HorValueSlider
  • 浏览小部件
    • 浏览器
    • SelectBrowser
    • HoldBrowser
    • MultiBrowser
    • 文件浏览器
    • CheckBrowser
  • 杂项小部件
    • Spinner
    • 时钟(圆形和方形)
    • 图表(提供多种图表类型)
    • 进度(进度条)
    • 工具提示
    • 输入选择
    • 帮助视图
  • 表格小部件
    • 树项

绘图原语

(在draw模块中)

表面类型

  • 打印机。
  • ImageSurface。
  • SvgFileSurface。

GUI设计器

fltk-rs支持FLUID,FLTK的RAD wysiwyg设计器。查看fl2rust cratefl2rust模板

示例

运行示例

cargo run --example editor
cargo run --example calculator
cargo run --example calculator2
cargo run --example counter
cargo run --example hello_svg
cargo run --example hello_button
cargo run --example fb
cargo run --example pong
cargo run --example custom_widgets
cargo run --example custom_dial
...

使用自定义主题以及FLTK提供的默认方案,如Gtk

不同的框架类型,可以与许多不同的小部件一起使用,如框架、按钮小部件、输入/输出小部件等。

更多有趣的示例可以在fltk-rs-demos 仓库中找到。还可以在这里找到7guis任务的良好实现此处。还可以在这里找到各种高级示例此处

主题

更多主题可以在fltk-theme crate中找到。

  • screenshots/aero.jpg

  • screenshots/black.jpg

等等...

额外的小部件

此crate公开了FLTK的集合小部件,它们都是可定制的。更多自定义小部件可以在fltk-extras crate中找到。

image

image

ss

image

教程

此处的播放列表中更多视频。一些演示项目可以在此处找到。

依赖关系