提问人:Paulo Luvisoto 提问时间:10/5/2023 最后编辑:Ken WhitePaulo Luvisoto 更新时间:10/5/2023 访问量:47
在不同的回调中调用相同的按钮
Call same button inside different callbacks
问:
我正在尝试使用 GUI 库 FLTK 在 Rust 中制作一个基本软件。在 Pastebin 上查看我的代码。我在第 18 行创建了一个名为 input1 的按钮。我需要在两个不同的回调中调用此按钮。但是第一个回调获取按钮所有权。因此,我在创建第二个回调时在第 41 行收到错误。 如何创建此按钮并在不同的回调中调用它?
https://pastebin.com/LKdfeKA3?fbclid=IwAR30JmY37ZIkmSMBzcwj0YuoWMLaLsMQwDtKJUgLUP01A-lm9d28bXzk0OM
use std::{borrow::BorrowMut, rc::Rc, cell::RefCell, sync::{Arc, Mutex}};
use fltk::{*, app, button::{Button, LightButton}, frame::Frame, prelude::*, window::Window, enums::*, text::{TextBuffer, TextDisplay}};
use fltk_calendar::calendar;
use fltk::button::CheckButton;
use chrono::prelude::*;
fn main() {
let mut data_geracao_str = String::new();
let mut data_geracao_inicio_str = String::new();
let app = app::App::default();
let mut wind = Window::new(20, 40, 800, 600, "Gerador de Arquivos Diários - Armarinhos Fernando");
let mut _titulo1 = Frame::new(30, 33, 150, 10, "Data Inicial");
let mut input1 = input::Input::new(160,25,150,35,"");
let mut but_cal1 = button::Button::new(320, 25, 80, 36, "Calendário");
but_cal1.set_label_size(10);
input1.deactivate();
but_cal1.deactivate();
but_cal1.set_callback( move|_| {
let cal = calendar::Calendar::default();
let naive_date = cal.get_date();
if let Some(naive_date) = naive_date {
data_geracao_inicio_str.clear();
data_geracao_inicio_str.push_str(naive_date.format("%Y-%m-%d").to_string().as_str());
input1.set_value(data_geracao_inicio_str.as_str());
data_geracao_inicio_str.push_str(" 00:00:00 +00:00");
println!("{:?}",&data_geracao_inicio_str);
}
});
let mut check_input = CheckButton::new(415,25,250,40,"Data Inicio Diferente");
check_input.set_callback( |check1|{
if check1.is_checked(){
input1.set_value("");
//input1.set_value("");
//&input1.activate();
but_cal1.activate();
}else{
//&input1.set_value("");
//&input1.deactivate();
but_cal1.deactivate();
}
});
let mut _titulo2 = Frame::new(30, 95, 150, 10, "Data Final");
let mut input2 = input::Input::new(160,85,150,35,"");
let mut but_cal2 = button::Button::new(320, 85, 80, 36, "Calendário");
but_cal2.set_label_size(10);
let mut btn_pix = button::Button::new(30, 200, 110, 36, "PIX");
let mut btn_vendas = button::Button::new(150, 200, 110, 36, "Vendas");
let mut btn_previsao = button::Button::new(270, 200, 110, 36, "Previsão");
let mut btn_recebimento = button::Button::new(390, 200, 110, 36, "Recebimento");
let mut btn_ajustes = button::Button::new(510, 200, 110, 36, "Ajustes");
but_cal2.set_callback(move |_| {
let cal = calendar::Calendar::default();
let naive_date = cal.get_date();
if let Some(naive_date) = naive_date {
data_geracao_str.clear();
data_geracao_str.push_str(naive_date.format("%Y-%m-%d").to_string().as_str());
input2.set_value(data_geracao_str.as_str());
data_geracao_str.push_str(" 00:00:00 +00:00");
println!("{:?}",data_geracao_str);
}
});
wind.end();
wind.show();
app.run().unwrap();
}
答:
1赞
Kevin Reid
10/5/2023
#1
您可以获取同一按钮的第二个句柄,您可以将其移交给第一个回调,而不会在第二个回调中丢失它。.clone()
Button
{
let input1 = input1.clone();
but_cal1.set_callback(move |_| {
...
input1.set_value(data_geracao_inicio_str.as_str());
});
}
// now you can still use input1 here
这是 Rust 库中的常见模式;每当您有一个值充当某个实体的句柄时,该实体可以在外部(窗口中的按钮)进行交互,而不仅仅是由其所有者使用,它通常以这种方式实现克隆
特征。不幸的是,他们并不总是清楚地记录这种模式; 仅在其常见问题解答中顺便提及它。您应该留意何时可用,看看它是否符合您的需求。fltk
Clone
评论
0赞
Paulo Luvisoto
10/6/2023
这对我来说是新的。我认为clone()会在内存中创建其他Button对象。我不知道它会为同一个按钮创建一个处理程序。但是你的提示确实奏效了。谢谢!
0赞
Kevin Reid
10/6/2023
@PauloLuvisoto 嗯,它是该类型的新实例/值。但这并不一定意味着它完全独立于原版。Button
评论