如何在自己的回调中访问 FLTK 按钮? [复制]

Posted

技术标签:

【中文标题】如何在自己的回调中访问 FLTK 按钮? [复制]【英文标题】:How do I access a FLTK button inside its own callback? [duplicate] 【发布时间】:2020-04-07 14:24:08 【问题描述】:

我正在尝试学习 Rust,并决定尝试使用 FLTK crate。但是,我在尝试访问其自己的回调中的按钮时遇到了一些问题,我不知道如何解决它。

use fltk::app::*, button::*, frame::*, window::*;

fn main() 
    let app = App::default();
    let mut window = Window::new(100, 100, 400, 300, "Hello world!");

    let mut frame = Frame::new(0, 0, 400, 200, "");
    let mut button = LightButton::default()
        .with_pos(10, 10)
        .with_size(80, 40)
        .with_label("Clickity");

    button.set_callback(Box::new(|| 
        println!("Button is ", button.is_on());
        frame.set_label(&format!("", button.is_on()))
    ));
    window.show();
    app.set_scheme(AppScheme::Gleam);
    app.run().unwrap();

导致以下错误:

error[E0502]: cannot borrow `button` as mutable because it is also borrowed as immutable
  --> src/main.rs:15:5
   |
15 |       button.set_callback(Box::new(|| 
   |       ^      ------------          -- immutable borrow occurs here
   |       |      |
   |  _____|      immutable borrow later used by call
   | |
16 | |         println!("Button is ", button.is_on());
   | |                                  ------ first borrow occurs due to use of `button` in closure
17 | |         frame.set_label(&format!("", button.is_on()))
18 | |     ));
   | |_______^ mutable borrow occurs here

据我了解,我无法在回调中访问button,因为在调用set_callback 方法时我已经将它用作可变对象。我不知道我应该如何解决这个问题。

【问题讨论】:

看来Problems with mutability in a closure的答案可能会回答您的问题; Can't borrow mutably within two different closures in the same scope。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。 @Shepmaster 谢谢!通过将 Button 放在 RefCell 中似乎可以工作。 【参考方案1】:

@Shepmaster 链接了Problems with mutability in a closure,它为此提供了解决方案。

button改成

    let button = ::std::cell::RefCell::new(
        LightButton::default()
            .with_pos(10, 10)
            .with_size(80, 40)
            .with_label("Clickity"),
    );

并且回调更改为:

    button.borrow_mut().set_callback(Box::new(|| 
        let button = button.borrow();
        println!("Button is ", button.is_on());
        frame.set_label(&format!("", button.is_on()))
    ));

程序现在按预期编译和运行。

【讨论】:

以上是关于如何在自己的回调中访问 FLTK 按钮? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

带有按钮回调的新窗口未在 fltk 中打开

FLTK 按钮回调给 c3867

存储来自回调 (FLTK) 的 Fl:Button 值

FLTK 值更改和重绘等到回调之后:有啥办法吗?

RUST + FLTK:从小部件 on_push() 函数访问另一个小部件

试图在 C++ 中的 Fltk GUI 中单击鼠标右键