You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在egui中创建标签后修改其值及获取部件ID

问题1:标签内容修改后不更新的解决方法

你的代码核心问题是**label_text变量的生命周期错误**:它被定义在CentralPanel::show的外层(大概率是update函数内部),而egui的update函数每帧都会执行,每次执行都会重新初始化label_text为"Change this",导致你在do_stuff里修改的值在下一帧被覆盖,自然看不到更新。

正确的做法是把label_text作为App结构体的状态成员,让它在应用生命周期内持续存在:

  1. 定义包含状态的App结构体:
struct MyApp {
    label_text: String,
}

impl MyApp {
    fn new(_cc: &eframe::CreationContext<'_>) -> Self {
        Self {
            label_text: "Change this".to_string(),
        }
    }
}
  1. 在update函数中使用结构体的可变状态:
impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.add(egui::Label::new(&self.label_text));
            if ui.add(egui::Button::new("Press me")).clicked() {
                do_stuff(&mut self.label_text, ctx);
            }
        });
    }
}

你的do_stuff函数无需修改,只要确保传入的是App结构体中持续存在的label_text即可。

问题2:获取/指定egui部件的ID

egui采用声明式UI模式,和C++的命令式UI逻辑不同,但依然可以手动指定或获取部件的ID:

手动指定部件ID

大部分egui部件都提供.with_id_source()方法,你可以传入任意能生成唯一标识的值(字符串、数字、自定义结构体等)来指定ID:

// 用字符串作为ID来源
ui.add(egui::Label::new(&self.label_text).with_id_source("my_unique_label"));

// 或者用Id类型直接指定
use egui::Id;
ui.add(egui::Button::new("Press me").with_id(Id::new("custom_button_id")));

获取部件的ID

如果需要获取某个部件自动生成的ID,可以通过添加部件后返回的Response对象获取:

let response = ui.add(egui::Label::new("test"));
let label_id = response.id; // 获取该Label的ID

注意事项

egui的ID主要用于持久化部件状态(比如折叠面板的展开状态)、响应全局事件等,由于是声明式UI,通常不需要像C++那样通过ID直接操作部件,而是通过修改App状态来驱动UI更新。

内容的提问来源于stack exchange,提问作者Lucien A. Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:45:11