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

问题描述 投票:0回答:1

我正在尝试使用 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();
 
}
rust fltk
1个回答
0
投票

您可以

.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 库中的常见模式;每当你有一个值充当某个可以与外部交互的实体(窗口中的按钮)的句柄时,而不是 only 被其所有者使用,它通常会实现

Clone
特征方式。不幸的是,他们并不总是清楚地记录这种模式;
fltk
仅在其常见问题解答中顺便提及。您应该留意 Clone
 何时可用,看看它是否符合您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.