rust GTK-rs正在从GTK::Entry获取输入

mwngjboj  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(274)

我有一个小的gtk-rs应用程序,我试图显示一个输入字段,并从用户那里获得输入。目前,当用户单击按钮时,我无法从输入字段中获得输入。我知道button.connect_clicked是我需要做的,但我不知道如何做?
我的build_ui方法:

use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button, Orientation};

pub fn build_ui(app: &Application) {
    let button = Button::builder()
        .label("Submit")
        .margin_top(12)
        .margin_bottom(12)
        .margin_start(12)
        .margin_end(12)
        .build();

    let input = gtk::Entry::builder()
        .placeholder_text("input")
        .margin_top(12)
        .margin_bottom(12)
        .margin_start(12)
        .margin_end(12)
        .build();

    let gtk_box = gtk::Box::builder()
        .orientation(Orientation::Vertical)
        .build();
    gtk_box.append(&input);
    gtk_box.append(&button);

    button.connect_clicked(move | _button| {
        println!("{}", input.display()); 
    });

    let window = ApplicationWindow::builder()
        .application(app)
        .title("gtk-app")
        .child(&gtk_box)
        .default_height(720)
        .default_width(360)
        .build();

    window.present();
}

main.rs:

const APP_ID: &str = "org.my-gtk-app";

fn main() {
    // Create a new application
    let app = Application::builder().application_id(APP_ID).build();

    // Connect to "activate" signal of `app`
    app.connect_activate(home::build_ui);

    // Run the application
    app.run();
}

我发现this question几乎是完全相同的,但是当我尝试实现该解决方案时,所有的.add方法都抛出一个错误,说明:

the following trait bounds were not satisfied: `ApplicationWindow: IsA<CellArea>` which is required by `ApplicationWindow: gtk4::prelude::CellAreaExt`

**编辑:**根据编译器,Gtk::Entry也没有.get_text()方法。在谷歌上搜索了一下,GTK3似乎有Gtk::Entryget_text方法,但Gtk4没有。

那么,有人知道在使用Gtk4时如何从Gtk::Entry对象中获取文本吗?

**编辑2:**我想我需要使用.display()方法,但是当我现在运行代码时,我没有从用户那里得到文本输入。input.display()只返回一个空字符串。我更新了代码示例以反映这些更改。

kninwzqo

kninwzqo1#

Entry确实有一个text()方法,它给你一个GString(因为Entry实现了Editable),可以使用as_str()将其转换为一个rust str
因此,为了从条目中获取当前文本,您可以执行以下操作:

let my_input_value = my_input.text().as_str();

为了完整起见,下面是更新后的build_ui函数:

pub fn build_ui(app: &Application) {
    let button = Button::builder()
        .label("Submit")
        .margin_top(12)
        .margin_bottom(12)
        .margin_start(12)
        .margin_end(12)
        .build();

    let input = gtk::Entry::builder()
        .placeholder_text("input")
        .margin_top(12)
        .margin_bottom(12)
        .margin_start(12)
        .margin_end(12)
        .build();

    let gtk_box = gtk::Box::builder()
        .orientation(Orientation::Vertical)
        .build();
    gtk_box.append(&input);
    gtk_box.append(&button);

    button.connect_clicked(move | _button| {
        println!("{}", input.text().as_str()); 
    });

    let window = ApplicationWindow::builder()
        .application(app)
        .title("gtk-app")
        .child(&gtk_box)
        .default_height(720)
        .default_width(360)
        .build();

    window.present();
}

编辑

由于GString实现了Display,因此以下代码也可以正常工作:

println!("{}", input.text());

相关问题