Наконец-то я решил эту проблему! Ввод работает, я могу набирать некоторый текст с помощью кнопок приложения.
Это в дополнение к первому и второму посту на тему «Делаем GTK клавиатуру на Rust».
Нужно добавить glib в список [зависимостей].
glib = "0.15.12"
И в список кристаллов
use glib::clone;
Теперь подключаемся и клонируем!()
button_1.connect_clicked(clone!(
@strong entry =>
move |_| {
entry.insert_text("1", &mut -1);
}
));
Каждый раз, когда нам нужно переместить данные из закрытия, мы должны @strong клонировать его. После этого мы можем использовать insert_text() или set() — в зависимости от ваших целей.
Если мы хотим сохранить какое-то значение в переменной, нам нужно @strong эту переменную и использовать Reference Counter. Это часть стандартной библиотеки, поэтому нам не нужно изменять наш файл Cargo.toml.
use std::rc::Rc;
Теперь создайте переменную типа Rc<Cell<f64>>
и клонируйте ее в закрытие.
let some_value: Rc<Cell<f64>> = Rc::new(Cell::new(0.0));
Это то же самое, что и в предыдущем примере
@strong entry, @strong some_value =>
Вот так! Мы можем набирать текст, изменять ввод и сохранять все
button_1.connect_clicked(clone!(
@strong entry, @strong some_value =>
move |_| {
set_value(&some_value, 1.0);
entry.insert_text("1", &mut -1);
}));
// some code
pub fn set_value(some_value: &Rc<Cell<f64>>, entered_number: f64) {
some_value.set(some_value.get() * 10.0 + entered_number);
println!("{}", some_value.get());
}
Как вы можете видеть, entry и some_value были клонированы в закрытие. Данные переместились в функцию set_value. Здесь мы можем изменить нашу переменную — она будет результатом конкатенации предыдущего и нового значения. Нам нужна get() для получения данных из RC и set() для установки нового значения.
Теперь при каждом нажатии клавиши вы будете видеть обновленное значение переменной в командной строке. Например:
1
15
158