egui
GUIs de modo imediato em Rust com egui e eframe - iteração rápida para ferramentas, inspetores e utilitários.
Receita
eframe::run_native(
"Minha Ferramenta",
eframe::NativeOptions::default(),
Box::new(|cc| {
egui_extras::install_image_loaders(&cc.egui_ctx);
Ok(Box::new(MyApp::default()))
}),
)?;Quando usar isso:
- Ferramentas internas de desenvolvimento e visualizadores de dados em tempo real
- UI de depuração de engine de jogos (emparelha com Bevy
bevy_egui) - Prototipagem de layouts sem CSS/HTML
- Aplicativos que priorizam a velocidade do desenvolvedor em vez da aparência nativa
Exemplo de Trabalho
struct MyApp {
name: String,
age: u32,
}
impl Default for MyApp {
fn default() -> Self {
Self {
name: "Alice".into(),
age: 30,
}
}
}
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Perfil");
ui.text_edit_singleline(&mut self.name);
ui.add(egui::Slider::new(&mut self.age, 0..=120));
if ui.button("Cumprimentar").clicked() {
println!("Olá {}, idade {}", self.name, self.age);
}
});
}
}O que isso demonstra:
- Estado mutável do aplicativo em
selfa cada frame - Widgets padrão: edição de texto, slider, botão
- Base de layout do painel central
Mergulho Profundo
Como Funciona
- Cada frame: eventos de entrada ->
update-> layout dos widgets -> pintura. - IDs de widgets derivados de locais de memória e rótulos - IDs estáveis são importantes para o foco.
Contextsolicita repintura quando animações ou dados assíncronos chegam.- Texturas e fontes gerenciadas pelo atlas do egui.
Imediato vs Retido
| Modo | egui | iced |
|---|---|---|
| Modelo | Reconstrói a UI a cada frame | Difere a árvore de widgets |
| Melhor para | Ferramentas | Aplicativos de consumidor |
Armadilhas
- Trabalho pesado em
update- causa queda de frames. Correção: compute em thread de background, consulte resultados via canal. - IDs de widgets instáveis - foco pula. Correção:
ui.push_idpara listas dinâmicas. - Não é focado em acessibilidade - suporte a leitor de tela limitado em comparação com toolkits nativos. Correção: escolha iced/Tauri para aplicativos críticos de acessibilidade.
- Escalonamento de alta DPI - verifique em telas retina; defina
pixels_per_pointapropriadamente. - Fontes padrão e CJK - carregue bytes de fonte personalizados para scripts não latinos.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| iced | Arquitetura Elm, aparência nativa | Precisa do ecossistema HTML |
| Tauri | Designers web na equipe | Quer UI de linguagem única |
| Slint | UI declarativa com ferramenta de design | Preferência pura por modo imediato |
| GTK via gtk-rs | Integração GNOME | UX idêntica multiplataforma |
FAQs
eframe vs winit customizado?
eframe é o início mais rápido; integração customizada ao incorporar em uma engine de jogos.
Tematização?
Visuals::dark() / light() ou Spacing e Style customizados no Context.
Plotagem?
Crate egui_plot para gráficos de linha/dispersão dentro do mesmo loop de modo imediato.
Dados assíncronos?
ctx.request_repaint() quando a thread de background preenche o buffer; leia sob Mutex em update.
Mobile?
egui no Android/iOS é possível, mas não é o foco principal - teste os alvos de toque cuidadosamente.
Integração Bevy?
Plugin bevy_egui para overlays dentro do jogo - veja a seção de desenvolvimento de jogos.
Persistência?
Serializa o estado para JSON ao sair - não é automático como frameworks de UI retidos.
Foco de entrada?
Use rótulos/IDs consistentes em loops; helper Memory para posições de janela.
Profiling de performance?
Integração puffin ou tracy; reduza a contagem de widgets por painel.
Arquitetura de estado?
Veja Estado e Arquitetura para aplicativos maiores.
Relacionado
- Noções Básicas de GUI - exemplo introdutório de egui
- Estado e Arquitetura - escalonando o estado
- iced - alternativa retida
- Empacotamento e Distribuição - distribua binários
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.