Senlyn
林间碎影月痕过客

Rust + eframe 学习

3 分钟阅读更新于 2026-04-192026-04-19866 字世界式

从安装开始

下载:https://www.rust-lang.org/zh-CN/tools/install

直接打开,按照默认即可。如果很慢就关掉,输入:

> $env:RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
> $env:RUSTUP_UPDATE_ROOT="https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup"

输入

> rustc --version

出现版本号就成功了。

Hello World

创建一个程序:

> cargo new HelloWorld
> cd .\HelloWorld\

可以先安装下 GNU 工具链:

> rustup toolchain install stable-gnu
> rustup default stable-gnu

然后输入 cargo run 运行程序,程序会输出 Hello, world!

变量

定义(要修改需要加上mut 标识符):

类型:i32,u64,i128,f64,bool,char

元组(固定长度不同类型):let sb = ("str" , 114 , 5.14);(取值用sb.0

数组(固定长度相同类型):let nums: [i32 ; 3] = [1 , 2 , 3];

函数

fn f(n: i32) -> i32 { //函数体
if(n == 0) return 1;
return f(n - 1) * n;
}
fn add(a: i32 , b: i32) -> i32{ //表达式,返回 a + b
a + b
}

顺序/循环 结构

进阶

速通完 rust,来尝试编写一个桌面应用程序吧!

eframe

1. 窗口创建

打开 Cargo.toml 添加依赖:eframe = "0.27"

然后来到 src/main.rs 在第一行导入库:use eframe::egui;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions::default();
    eframe::run_native("My egui App", options, Box::new(|cc| Box::new(QWQ::new(cc))));
}

这里解释下 run_native

pub fn run_native(
title: &str,
native_options: NativeOptions,
app_creator: impl FnOnce(&CreationContext) -> Box<dyn App> + 'static,
) -> Result<(), Error>

native_options 表示窗口配置,比如窗口大小,是否全屏,图标等。代码里是默认值。

app_creator 是一个闭包函数(相当于匿名函数,| 参数 | 语句块/表达式),是用来给框架返回应用实例的。

然后该句没有分号,是表达式,作为 main 的返回值。

我们接着看剩下的代码:

#[derive(Default)]
struct QWQ {}
impl QWQ {
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        Self::default()
    }
}

其中,QWQ 是应用状态的结构体。

#[derive(Default)] 不是注释,形如 #[..] 的是 Rust 属性宏,可以给代码附加功能。这行可以自动实现一个 default 函数,会返回这个结构体的默认值,代码形如:

impl Default for QWQ { // 编译器自动帮你写的代码
fn default() -> Self { QWQ {} }
}

我们注意到有一个 impl ,这个是 implementation(实现)的缩写,开始给类型,结构体等添加方法函数的关键字。

接下来,实现 eframe 框架的核心,一定要实现 impl eframe::App for XXX 和函数 update

impl eframe::App for QWQ {
   fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
       egui::CentralPanel::default().show(ctx, |ui| {
           ui.heading("Hello World!");
       });
   }
}

这里面, self 表示结构体,ctx 用来控制整个 UI,frame 是窗口本身,可以控制窗口关闭。

然后再在终端中输入 cargo run 就可以看到界面了。

2.

可以改 options 来改变窗口配置:

let mut options = eframe::NativeOptions::default();
options.centered = true;

然后我们写出如下代码,比较简单不解释了:

use eframe::egui;
fn main() -> Result<(), eframe::Error> {
    let mut options = eframe::NativeOptions::default();
    options.centered = true;
    eframe::run_native("Tools", options, Box::new(|cc| Box::new(QWQ::new(cc))))
}
#[derive(Default)]
struct QWQ {
    nums: i32 ,
}
impl QWQ {
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        Self { nums : 0 }
    }
}
impl eframe::App for QWQ {
    fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("Hello World!");
            ui.horizontal(|ui| {
                if ui.button("dark").clicked() {
                    ctx.set_visuals(egui::Visuals::dark());
                }
                if ui.button("light").clicked() {
                    ctx.set_visuals(egui::Visuals::light());
                }
            });
            ui.label(self.nums.to_string());
       });
       self.nums += 1;
   }
}

我们运行可以发现,显示的数字只有在鼠标等状态改变时才增加,所以 update 函数就是在这个时候被调用的。


最终发现,rust 太难了。。。还是 pyhton 好。

RSS