我正在尝试使用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条答案
按热度按时间qvsjd97n1#
您可以
.clone()
Button
来获得同一按钮的第二个句柄,您可以将其传递给第一个回调函数,而不会在第二个回调函数中丢失它。这是Rust库中的常见模式;每当你有一个值作为一个句柄到一些实体,可以与外部交互(窗口中的按钮),而不是 * 仅 * 由其所有者使用,它通常以这种方式实现
Clone
trait。不幸的是,他们并不总是清楚地记录这种模式;fltk
只是在它的FAQ中顺便提到了它。你应该留意Clone
何时可用,看看它是否能满足你的要求。