我正在尝试使用 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();
}
您可以
.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
何时可用,看看它是否符合您的要求。