rust - 如何从单击按钮的条目中获取信息?

标签 rust gtk-rs

我想从单击按钮时的条目中获取输入,并在单击另一个按钮时显示该信息。这给了我一个错误,因为闭包取得了我的 firstname 变量的所有权,我想在其中存储信息。

如何从条目中获取信息并重新使用它?

// import gtk libs
extern crate gio;
extern crate gtk;

// declare use of gtk
use gtk::prelude::*;

fn main() {
    let mut firstname = String::new();

    if gtk::init().is_err() {
        println!("Failed to initialize GTK.");
        return;
    }
    let glade_src = include_str!("builder.glade");
    let builder = gtk::Builder::new_from_string(glade_src);

    let window: gtk::Window = builder.get_object("window1").unwrap();
    let buttonSubmit: gtk::Button = builder.get_object("buttonSubmit").unwrap();
    let buttonShow: gtk::Button = builder.get_object("buttonShow").unwrap();
    let entryFirstname: gtk::Entry = builder.get_object("entryFirstname").unwrap();

    // get information from entry
    buttonSubmit.connect_clicked(move |_| {
        firstname = entryFirstname.get_buffer().get_text();
    });

    // output information
    let firstname_clone = firstname.clone();
    buttonShow.connect_clicked(move |_| {
        println!("Firstname: {}", firstname_clone);
    });

    window.show_all();

    gtk::main();
}

最佳答案

一旦你的字符串被移动到闭包中,编译器就不能再静态地检查你是否混合了对它的读写访问。您需要使用 RefCell启用读/写访问的运行时选择,可能与 Rc 结合使用适当的内存管理:

let firstname = Rc::new(RefCell::new(String::new()));
let firstname_clone = firstname.clone();
// ...
buttonSubmit.connect_clicked(move |_| {
    firstname.replace(entryFirstname.get_buffer().get_text());
});
// ...
buttonShow.connect_clicked(move |_| {
    println!("Firstname: {}", firstname_clone.borrow());
});

关于rust - 如何从单击按钮的条目中获取信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582777/

相关文章:

rust - 如何处理 mio 中的错误?

logging - 如何在Rust中将自定义数据传递到日志箱的宏?

rust - 如何使用 gtk-rs 在列表存储/ TreeView 中右对齐数字数据

rust - 为什么在闭包内克隆数据不能防止错误 "closure may outlive the current function"?

multithreading - 如何在 Rust 中的自定义单线程迭代器上并行处理 `map(...)`?

vector - Rust - 大小在运行时定义的向量

rust - 如何使用Diesel连接和Gtk-rs事件?

rust - 无法移出共享引用后面的 ***

rust - 尝试从 GTK-RS 应用程序的事件处理程序中添加到 `gtk::ListBox` 时似乎没有任何反应