rust 在不同的回调中调用相同的按钮

rryofs0p  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在尝试使用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();
 
}
qvsjd97n

qvsjd97n1#

您可以.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库中的常见模式;每当你有一个值作为一个句柄到一些实体,可以与外部交互(窗口中的按钮),而不是 * 仅 * 由其所有者使用,它通常以这种方式实现Clone trait。不幸的是,他们并不总是清楚地记录这种模式; fltk只是在它的FAQ中顺便提到了它。你应该留意Clone何时可用,看看它是否能满足你的要求。

相关问题