【问题标题】:Gtk.Entry unable to set_text from another methodGtk.Entry 无法从其他方法设置文本
【发布时间】:2018-11-26 21:21:17
【问题描述】:

vala 和 Gtk 的新手。 我无法调用 Gtk.Entry 的 set_text 方法来从另一个方法设置文本。这是我尝试过的示例代码。我可以在 activate() 方法中设置文本,但不能在 tryThis() 方法中。

using Gtk;
public class MyApplication : Gtk.Application {

public MyApplication () {
    Object(application_id: "testing.my.application",
    flags: ApplicationFlags.FLAGS_NONE);
}

protected override void activate () {

    Gtk.ApplicationWindow window = new Gtk.ApplicationWindow (this);
    window.set_default_size (800, 600);
    window.window_position = WindowPosition.CENTER;
    window.set_border_width(10);

    Gtk.HeaderBar headerbar = new Gtk.HeaderBar();
    headerbar.show_close_button = true;
    headerbar.title = "Window";
    window.set_titlebar(headerbar);

    //Entry is initialized here
    Gtk.Entry entry = new Gtk.Entry();
    entry.set_text ("Before button click");

    //Button is initialized and connect to method
    Gtk.Button but = new Gtk.Button.with_label("Click me");
    but.clicked.connect(tryThis);

    Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
    vbox.pack_start(entry, false, false, 10);
    vbox.pack_start(but, false, false, 20);

    window.add(vbox);
    window.show_all ();
}

private void tryThis() {
    Gtk.Entry entry = new Gtk.Entry();
    //This is not working!!
    entry.set_text ("After button click");
    message("%s -", "I am here");
}

public static int main (string[] args) {
    MyApplication app = new MyApplication ();
    return app.run (args);
}

}

【问题讨论】:

    标签: gtk3 vala


    【解决方案1】:

    问题是范围问题。所以activate 在该方法的范围内创建一个entry,而不是整个类。 tryThis 创建 Gtk.Entry 的新实例,并将其分配给该方法范围内的变量 entry,而不是整个类。

    此示例解决了您的问题,但不是最佳解决方案,如示例后所述:

    using Gtk;
    
    public class MyApplication : Gtk.Application {
    
      Gtk.Entry entry;
    
      public MyApplication () {
        Object(application_id: "testing.my.application",
        flags: ApplicationFlags.FLAGS_NONE);
      }
    
      protected override void activate () {
    
      Gtk.ApplicationWindow window = new Gtk.ApplicationWindow (this);
      window.set_default_size (800, 600);
      window.window_position = WindowPosition.CENTER;
      window.set_border_width(10);
    
      Gtk.HeaderBar headerbar = new Gtk.HeaderBar();
      headerbar.show_close_button = true;
      headerbar.title = "Window";
      window.set_titlebar(headerbar);
    
      //Entry is initialized here
      entry = new Gtk.Entry();
      entry.set_text ("Before button click");
    
      //Button is initialized and connect to method
      Gtk.Button but = new Gtk.Button.with_label("Click me");
      but.clicked.connect(tryThis);
    
      Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
      vbox.pack_start(entry, false, false, 10);
      vbox.pack_start(but, false, false, 20);
    
      window.add(vbox);
      window.show_all ();
      }
    
      private void tryThis() {
        entry.set_text ("After button click");
        message("%s -", "I am here");
      }
    
      public static int main (string[] args) {
        MyApplication app = new MyApplication ();
        return app.run (args);
      }
    }
    

    你应该注意到:

    • entry 被引入到整个类的范围内,Gtk.Entry entry; 在类定义的开头
    • entry = new Gtk.Entry (); 已从 tryThis 中删除,因为在调用 activate 时已实例化该条目

    这可行,但从长远来看,最好将窗口与应用程序分开。例如,使用activate 实例化一个新的MainApplicationWindow。 Vala 还包括 Gtk 模板的代码生成例程。这允许您使用 XML 或 GUI 工具 Glade 定义窗口及其子窗口小部件,然后使用 Vala 属性 [GtkTemplate][GtkChild][GtkCallback] 附加 Vala 代码。

    【讨论】:

    • 干得好!我知道问题出在哪里,但不知道如何在 Vala 中解决它。我正在尝试 but.clicked.connect(tryThis, entry); 将条目对象传递给回调,但这不起作用。
    • 完美!这解释得很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多